androidStudio编写的你好三角形的opengl程序图形出不来,找了好几天了,未果,求大神指点

stone_js 2017-09-29 09:09:49
MainActivity代码:

package com.kingzone3d.testopenglsufaceview;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.kingzone3d.testopenglsufaceview.MainActivity">

<com.kingzone3d.testopenglsufaceview.MyGLView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</LinearLayout>


MyGLView的代码

package com.kingzone3d.testopenglsufaceview;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;

/**
* Created by JS on 2017/9/28.
*/

public class MyGLView extends GLSurfaceView{
private MyRenderer mRenderer;
public MyGLView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setEGLContextClientVersion(2);
mRenderer = new MyRenderer();
this.setRenderer(mRenderer);
this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}

MyRenderer代码:

package com.kingzone3d.testopenglsufaceview;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

import java.nio.ByteBuffer;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

/**
* Created by JS on 2017/9/28.
*/

public class MyRenderer implements MyGLView.Renderer{
int iProgramID;
FloatBuffer mVertexPosiBuffer;
int aPosiHandle;

@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
final float fVertex[] = { //x,y,z,s1,t1,s2,t2
-1.0f, 1.0f, 0.0f, 0.0f,//0.0f, 1.0f, 0.5f, 1.0f,
1.0f, -1.0f, 0.0f, 0.0f,
-1.0f, -1.0f, 0.0f, 0.0f//, // -0.0f,//0.0f, 0.0f, 0.5f, 0.0f,
//1.0f, -1.0f, 0.0f, 0.0f//, -0.0f//, //0.5f, 0.0f, 1.0f, 0.0f,
//1.0f, 1.0f, -0.0f //, 0.5f, 1.0f, 1.0f, 1.0f
};

iProgramID = MyShaderUtils.createGlProgram();
aPosiHandle = GLES20.glGetAttribLocation(iProgramID, "aPosition");
mVertexPosiBuffer = ByteBuffer.allocateDirect(fVertex.length * 4).asFloatBuffer().put(fVertex);
}

@Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}

@Override
public void onDrawFrame(GL10 gl10) {
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glUseProgram(iProgramID);
mVertexPosiBuffer.position(0);
GLES20.glVertexAttribPointer(aPosiHandle, 4, GLES20.GL_FLOAT, false, 0, mVertexPosiBuffer);
GLES20.glEnableVertexAttribArray(aPosiHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
GLES20.glFlush();
}
}

ShaderUtils代码:

package com.kingzone3d.testopenglsufaceview;

/**
* Created by JS on 2017/9/28.
*/

import android.opengl.GLES20;

import android.opengl.GLES20;
import android.opengl.GLES30;
import android.util.Log;

/**
* Created by JS on 2017/9/20.
*/

public class MyShaderUtils {
private static final String TAG = "ShaderUtils";
public static void checkGlError(String lable){
int error;
while((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR){
Log.e(TAG, lable + "checkGlError: " + error);
throw new RuntimeException(lable + ":glError" + error);
}
}

public static int createGlProgram()
{
StringBuilder sbv = new StringBuilder();
sbv.append("attribute vec4 aPosition;\n");
sbv.append("void main(){\n");
sbv.append("gl_Position=aPosition;\n");
sbv.append("}\n");
final String vertexShaderCode = sbv.toString();

StringBuilder sbf = new StringBuilder();
sbf.append("precision mediump float;\n");
sbf.append("void main(){\n");
sbf.append("gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);\n");
sbf.append("}\n");
final String fragmentShaderCode=sbf.toString();


int vertexShader = createShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
if(vertexShader == 0){
return 0;
}
int fragmentShader = createShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
if(fragmentShader == 0){
GLES20.glDeleteShader(vertexShader);
return 0;
}

int program = GLES20.glCreateProgram();
if(program == 0) {
GLES20.glDeleteShader(vertexShader);
GLES20.glDeleteShader(fragmentShader);
return 0;
}

GLES20.glAttachShader(program, vertexShader);
checkGlError("glAttachShader");
GLES20.glAttachShader(program, fragmentShader);
checkGlError("glAttachShader");
GLES20.glLinkProgram(program);
int[] linkStatus = new int[1];
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
if(linkStatus[0] != GLES20.GL_TRUE){
Log.e(TAG, "Could not link program:");
Log.e(TAG, GLES20.glGetProgramInfoLog(program));
GLES20.glDeleteProgram(program);
program = 0;
}

return program;
}
public static int createShader(int shaderType, String source){
int shader = GLES20.glCreateShader(shaderType);
if(shader != 0){
GLES20.glShaderSource(shader, source);
GLES20.glCompileShader(shader);
int[] compiled = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
if(compiled[0] == 0) {
Log.e(TAG, "Could not compile shader ");
Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
String sInfor = GLES20.glGetShaderInfoLog(shader);
GLES20.glDeleteShader(shader);
shader = 0;
}
}
return shader;
}
}

...全文
192 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧