2013-10-03 44 views
0

嘿,你可以注意到这段代码有什么问题吗?它直接来自“Open GLES 2.0编程指南”一书,我一直在寻找结果并处理代码改变等等的东西,它仍然不会工作!GLES2中奇怪的着色器行为

attribute vec4 v_Position; 

void main() 
{ 
    gl_Position = v_Position; 
} 

片段着色器代码:

precision mediump float; 

void main() 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 

最后我的代码:(注意着色器编译成功所以做了这个代码产生的结果通过图像Rectangle is shown when it should be a triangle

顶点着色器代码附将两个着色器程序链接到名为“shaderProgram”的程序中)

GLfloat verts[] = {0.0f, 0.5f, 0.0f, 
    -0.5f, -0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f}; 
GLushort inds[] = {0,1,2}; 
GLuint ibo = 0; 
glUseProgram(shaderProgram); 
////get the buffer object 
glGenBuffers(1,&vbo); 
glGenBuffers(1,&ibo); 

glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glBufferData(GL_ARRAY_BUFFER,3*3,verts,GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3,inds,GL_STATIC_DRAW); 

GLint vPos = glGetAttribLocation(shaderProgram, "v_Position"); 
glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glEnableVertexAttribArray(vPos); 
glVertexAttribPointer(vPos,3,GL_FLOAT,GL_FALSE,3,0); 
glBindAttribLocation(shaderProgram, vPos, "v_Position"); 


glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 

glDeleteBuffers(1,&vbo); 
glDeleteBuffers(1,&ibo); 
+0

我不明白为什么'glVertexAttribPointer(VPOS,3,GL_FLOAT,GL_FALSE,3,0);'它必须是'glVertexAttribPointer(VPOS, 3,GL_FLOAT,GL_FALSE,0,(void *)0);' –

回答

0

功能似乎在功能 glVertexAttribPointer(vPos,3,GL_FLOAT,GL_FALSE,3,0);

第五个参数是步幅,而最后一个是大小。在这种情况下,你不需要它:它必须是: glVertexAttribPointer(vPos,3,GL_FLOAT,GL_FALSE,0, nullptr);

+0

嘿感谢您的回复, 这似乎阻止了任何绘画,我呈现了默认的glClear颜色。香港专业教育学院也尝试了zPos设置为负(和积极的只是包住),但仍没有结果:( –

+0

我固定它! glBufferData(GL_ARRAY_BUFFER,3 * 3,绿党,GL_STATIC_DRAW); 应的被 glBufferData( GL_ARRAY_BUFFER,3 * 3 * sizeof(GLfloat),verts,GL_STATIC_DRAW); –

+0

哦,对,我没有看到。 –