【问题标题】:GLSL : Vertices are missingGLSL:缺少顶点
【发布时间】:2013-06-21 00:32:11
【问题描述】:

当我使用即时模式时,它可以正确绘制,但是当我将相同的顶点传递给 GPU,甚至指向它们时,它就不起作用了。

有一个位置缓冲区保存顶点:

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);
}

立即结果:

着色器结果:

我不知道出了什么问题,我也尝试使用 glm::value_ptr 传递 posbuf,它们都给出相同的结果。我在 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];
};

【问题讨论】:

  • 显示索引 VBO 的 BufferData 调用。另外,出于好奇,你为什么不使用 VBO 来定位呢?
  • 我已经在使用 VBO,但是当它不起作用时,我想通过提取位置缓冲区来更具体地尝试它,手动指向它。但它仍然给出与 VBO 相同的结果。
  • 那么肯定是索引 vbo 导致了问题
  • 我添加了索引上传。
  • 如果索引缓冲区保存Triangles,它的.size()显然只是所有索引的1/3。

标签: opengl glsl


【解决方案1】:

您的 indices 向量似乎包含完整的三角形,每个三角形由 3 个索引组成。但是在glDrawElements 中,您使用indices.size() 作为要绘制的元素数。但是glDrawElements 不采用基元的数量,而是采用 indices 的数量,因此您缺少 2/3 的三角形。应该是

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

(并且indices 应该重命名为triangles 以避免进一步的混淆。顺便说一下,index 可能应该是unsigned int[3],正如 OpenGL 所承诺的那样。在任何合理的系统上都不会有表示上的差异在ints 和unsigned ints 之间,但是在告诉OpenGL 它是unsigned int 的同时使用int 有点不一致。)

【讨论】:

  • 在这里,为被盗答案 +1 :)
  • @BartekBanachewicz 好吧,如果您已经发现问题,请不要打扰 cmets。 (如果我事先阅读了您的评论,我什至可能不会写答案);)
  • 我刚刚阅读了确认修复的最后一条评论,几乎在同一时间你的答案出现了。不用担心,下次我会更快:&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多