2016-12-05 86 views
0

我一直在努力学习opengl,我似乎得不到一个三角形呈现我的代码应该工作它将呈现clearColor我设置它,但不是三角形和我的顶点和片段着色返回没有错误任何人都可以看到这个问题请和谢谢不能得到opengl es 2.0渲染一个三角形

public class MainActivity extends Activity implements GLSurfaceView.Renderer 
{ 
    public static int POSITION_ATTRIBUTE = 0; 
    public int program; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    GLSurfaceView glSurfaceView = new GLSurfaceView(this); 
    glSurfaceView.setEGLContextClientVersion(2); 
    glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
    glSurfaceView.setRenderer(this); 
    setContentView(glSurfaceView); 
} 

@Override 
public void onSurfaceCreated(GL10 unused, EGLConfig config) 
{ 
    // Vertex Shader Source Code 
    String vertexShaderSource = "" + 
     "attribute vec2 position; \n" + 
     "\n" + 
     "void main() \n" + 
     "{ \n" + 
     " gl_Position = vec4(position.x, position.y, 0.0, 1.0); \n" + 
     "} \n" + 
     "\n"; 

    String fragmentShaderSource = "" + 
     "\n" + 
     "\n" + 
     "void main() \n" + 
     "{ \n" + 
     " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); \n" + 
     "} \n" + 
     "\n"; 

    // Write and compile vertex shader 
    int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); 
    GLES20.glShaderSource(vertexShader, vertexShaderSource); 
    GLES20.glCompileShader(vertexShader); 
    Log.i("Vertex Shader", "Compile Log: " + GLES20.glGetShaderInfoLog(vertexShader)); 

    // Write and compile fragment shader 
    int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); 
    GLES20.glShaderSource(fragmentShader, fragmentShaderSource); 
    GLES20.glCompileShader(fragmentShader); 
    Log.i("Fragment Shader", "Compile Log: " + GLES20.glGetShaderInfoLog(fragmentShader)); 

    // Link the shaders into a program object 
    program = GLES20.glCreateProgram(); 
    GLES20.glAttachShader(program, vertexShader); 
    GLES20.glAttachShader(program, fragmentShader); 
    // Links the variables 
    GLES20.glBindAttribLocation(program, POSITION_ATTRIBUTE, "position"); 
    GLES20.glLinkProgram(program); 
    Log.i("Link", "Link Log: " + GLES20.glGetProgramInfoLog(program)); 

    GLES20.glClearColor(0.8f, 0.3f, 0.2f, 1.0f); 
    GLES20.glEnableVertexAttribArray(POSITION_ATTRIBUTE); 
} 

@Override 
public void onSurfaceChanged(GL10 unused, int width, int height) 
{ 

} 

@Override 
public void onDrawFrame(GL10 unused) 
{ 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    // Give OpenGl a trinagle to render 
    float[] geometry = new float[]{ 
     -0.2f, 0.3f, 
     0.4f, 0.5f, 
     0.1f, 0.1f, 
    }; 

    ByteBuffer geometryByteBuffer = ByteBuffer.allocateDirect(geometry.length * 4); 
    geometryByteBuffer.order(ByteOrder.nativeOrder()); 
    FloatBuffer geometryBuffer = geometryByteBuffer.asFloatBuffer(); 
    geometryBuffer.put(geometry); 
    geometryBuffer.rewind(); 
    GLES20.glVertexAttribPointer(POSITION_ATTRIBUTE, 2, GLES20.GL_FLOAT, false, 0, geometryBuffer); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, geometry.length/2); 
} 

}

+0

如果这是完整的代码,那么你缺少的是onPause()和onResume()的挂钩。请参阅'GLSurfaceView'文档。 –

+0

我知道我错过了那些问题 –

回答

1

的问题是我忘GLES20 .gl_Useprogram(程序);