无法获得opengl es 2.0来渲染三角形

时间:2016-12-05 23:11:11

标签: android c++ opengl-es opengl-es-2.0

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

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 triangle 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);
}

}

1 个答案:

答案 0 :(得分:1)

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