什么都不画

时间:2017-01-18 15:12:40

标签: android opengl-es

我使用这些函数在Android中使用OpenGL-ES绘制元素。首先在构造函数中绑定缓冲区(正确绑定因为使用GL10绘制)我使用CreateProgram函数创建程序,然后调用Draw。我认为问题出在draw函数中。谁能告诉我我的错误是什么?

PS:我没有发布缓冲区绑定代码,因为正如我所说的使用G10它们被绘制出来。现在我想使用GL20,因为可能我错了,但是阅读示例不同的问题和Android开发者网站OpenGL-ES上的一些页面更快,因为它使用静态函数。

这里确实有代码:

private final String vertexShader="" +
            "attribute vec3 vertex; \n" +
            "void main(){\n" +
            "   gl_Position=vertex;\n" +
            "}";

private final String fragmentShader="" +
            "attribute vec4 colors;\n" +
            "void main(){\n" +
            "   gl_FragColor=colors;\n" +
            "}";


public int LoadShader(String shader,int type){
    int sha= GLES20.glCreateShader(type);
    GLES20.glShaderSource(sha,shader);
    GLES20.glCompileShader(sha);
    return sha;
}

int program=0;
public void CreateGLProgram()
{
    program=GLES20.glCreateProgram();

    GLES20.glAttachShader(program,LoadShader(vertexShader,GLES20.GL_VERTEX_SHADER));
    GLES20.glAttachShader(program,LoadShader(fragmentShader,GLES20.GL_FRAGMENT_SHADER));

    GLES20.glLinkProgram(program);
}

public void DrawShader(){
    GLES20.glUseProgram(program);

    int vertex_handle=GLES20.glGetAttribLocation(program,"vertex");
    GLES20.glVertexAttribPointer(vertex_handle,3,GLES20.GL_FLOAT,false,4,coordinatesbuff);

    int frag_handle=GLES20.glGetAttribLocation(program,"colors");
    GLES20.glVertexAttribPointer(frag_handle,4,GLES20.GL_FLOAT,false,4,colorbuffer);

    GLES20.glDrawElements(GLES20.GL_TRIANGLES,indicies.length,GLES20.GL_UNSIGNED_SHORT,indiciesbuffer);

    GLES20.glDisableVertexAttribArray(vertex_handle);
    GLES20.glDisableVertexAttribArray(frag_handle);
}

2 个答案:

答案 0 :(得分:1)

除了BDL写的内容:

您应该使用glEnableVertexAttribArray(int index)启用属性指针:

int vertex_handle=GLES20.glGetAttribLocation(program, "vertex");
GLES20.glEnableVertexAttribArray(vertex_handle);
GLES20.glVertexAttribPointer(vertex_handle, 3, GLES20.GL_FLOAT, false, 4, coordinatesbuff);

int frag_handle=GLES20.glGetAttribLocation(program, "colors");
GLES20.glEnableVertexAttribArray(frag_handle);
GLES20.glVertexAttribPointer(frag_handle, 4, GLES20.GL_FLOAT, false, 4, colorbuffer);

答案 1 :(得分:0)

您无法在片段着色器中拥有属性。如果要在片段着色器中使用每顶点颜色,则必须在顶点着色器中定义此属性,并将数据传递到varying中的片段着色器。

此外,您应该检查着色器是否正在正确编译(glGetShaderiv(..., GL_COMPILE_STATUS...和链接(glProgramiv(..., GL_LINK_STATUS...)。这会使您走上正确的轨道,因为在片段着色器中使用属性应该触发编译错误。还应检查glGetError

相关问题