当我使用即时模式时,它会正确绘制,但是当我将相同的顶点传递给GPU时,甚至指向它们时,它不起作用。GLSL:缺少顶点
有一个位置缓冲控股顶点:
std::vector<glm::vec3> posbuf;
和索引它。
立即模式:
for (unsigned int i =0; i < indices.size(); i++) {
glBegin(GL_TRIANGLES);
glVertex3f(posbuf[indices[i].index[0]].x, posbuf[indices[i].index[0]].y, posbuf[indices[i].index[0]].z);
glVertex3f(posbuf[indices[i].index[1]].x, posbuf[indices[i].index[1]].y, posbuf[indices[i].index[1]].z);
glVertex3f(posbuf[indices[i].index[2]].x, posbuf[indices[i].index[2]].y, posbuf[indices[i].index[2]].z);
glEnd();
}
,这是顶点属性的代码:
glEnableVertexAttribArray(GL_ATTRIB_POS);
glVertexAttribPointer(GL_ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, 0,&posbuf[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indVBO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(GL_ATTRIB_POS);
和着色器用于它:
#version 120
attribute vec3 position;
void main()
{
vec4 finalv=vec4(position, 1.0);
gl_Position = gl_ModelViewProjectionMatrix * vec4(finalv.xyz,1.0);
}
[frag]
#version 120
void main()
{
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
直接结果:
着色器结果:
我不知道什么是错的,我也试图通过posbuf使用GLM :: value_ptr,他们都给予同样的结果。我在Fedora 18上,支持glsl到#version 140,opengl 3.3。
编辑:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle) * indices.size(), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
struct Triangle {
int index[3];
};
之间,但它是一个有点不一致使用
int
同时告诉OpenGL图像这是一个unsigned int
。)显示的'BufferData'呼吁指数VBO。另外,出于好奇,你为什么不使用VBO的职位呢? –我已经在使用VBO,但是当它不起作用时,我想通过提取位置缓冲区,手动指向它来更具体地尝试它。但它仍然给出与VBO相同的结果。 – deniz
那么肯定是它的索引vbo导致问题 –