我使用这些函数在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);
}
答案 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
。