2013-06-24 78 views
1

当我使用即时模式时,它会正确绘制,但是当我将相同的顶点传递给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); 
} 

直接结果:enter image description here

着色器结果: enter image description here

我不知道什么是错的,我也试图通过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]; 
}; 
+1

之间,但它是一个有点不一致使用int同时告诉OpenGL图像这是一个unsigned int。)显示的'BufferData'呼吁指数VBO。另外,出于好奇,你为什么不使用VBO的职位呢? –

+0

我已经在使用VBO,但是当它不起作用时,我想通过提取位置缓冲区,手动指向它来更具体地尝试它。但它仍然给出与VBO相同的结果。 – deniz

+1

那么肯定是它的索引vbo导致问题 –

回答

2

看来你indices向量包含由每3个指标完成三角形。但是在glDrawElements中,您使用indices.size()作为要绘制的元素的数量。但glDrawElements不占用基元数量,但指数的数量为,所以你缺少三分之二的三角形。它应该是

glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0); 

(和indices应该被重新命名为triangles,以避免进一步的混乱。顺便说一句,index也许应该unsigned int[3]按照承诺的OpenGL。在任何合理的制度不会有一个代表性差异int S和unsigned int小号

+0

在这里,为被盗的答案+1 +1 –

+0

@BartekBanachewicz好吧,如果你已经发现了问题,不要打扰评论。(如果我事先阅读了你的评论,我甚至可能会避免写一个答案);) –

+0

我刚刚阅读了最后一条确认修复的评论,并且几乎在同一时刻你的答案出现了。不用担心,下次我会快一点':>'。 –