Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL:缺少顶点_Opengl_Glsl - Fatal编程技术网

Opengl GLSL:缺少顶点

Opengl GLSL:缺少顶点,opengl,glsl,Opengl,Glsl,当我使用即时模式时,它会正确绘制,但当我将相同的顶点传递到GPU,甚至指向它们时,它就不起作用了 有一个保存顶点的位置缓冲区: std::vector<glm::vec3> posbuf; 以及它的着色器: #version 120 attribute vec3 position; void main() { vec4 finalv=vec4(position, 1.0); gl_Position = gl_ModelViewProjectionMatrix * v

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

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

std::vector<glm::vec3> posbuf;
以及它的着色器:

#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,它们都给出了相同的结果。我在Fedora18上,支持glsl高达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];
};

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

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

(和
索引
应重命名为
三角形
,以避免进一步混淆。顺便说一下,
索引
可能应该是
无符号整数[3]
就像OpenGL承诺的那样。在任何合理的系统上,
int
s和
unsigned int
s之间都不会有代表性的区别,但是在告诉OpenGL它是
unsigned int
时使用
int
会有点不一致。

显示
缓冲数据
对VBO的调用。另外,出于好奇,为什么不在位置上使用VBO呢?我已经在使用VBO了,但当它不起作用时,我想更具体地尝试一下,只提取位置缓冲区,手动指向它。但是它仍然给出了与VBO相同的结果。那么最肯定的是索引VBO导致了问题。我添加了索引上载。如果索引缓冲区包含
三角形
s,那么它的
.size()
显然只占所有索引的1/3。这里,偷来的答案是+1:)@BartekBanachewicz,如果你已经发现了问题,就不要费心评论。(如果我事先看了你的评论,我甚至可以不写答案)我刚刚读了最后一条确认修复的评论,几乎就在你的答案出现的同一点上。别担心,下次我会更快的。
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];
};
glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0);