C++ 属性位置!=0

C++ 属性位置!=0,c++,opengl,glsl,C++,Opengl,Glsl,我有以下非常简单的顶点着色器,当我使用它渲染时,会得到一个空白屏幕: #version 110 layout(location = 1) attribute vec3 position; uniform mat4 modelview_matrix; uniform mat4 projection_matrix; void main() { vec4 eye = modelview_matrix * vec4(position, 1.0); gl_Position = pr

我有以下非常简单的顶点着色器,当我使用它渲染时,会得到一个空白屏幕:

#version 110

layout(location = 1) attribute vec3 position;

uniform mat4 modelview_matrix;
uniform mat4 projection_matrix;

void main() {
    vec4 eye = modelview_matrix * vec4(position, 1.0);

    gl_Position = projection_matrix * eye;
}
然而,改变

布局(位置=1)属性向量3位置

布局(位置=0)属性vec3位置

允许我正确渲染。以下是我的渲染功能:

glUseProgram(program);

GLenum error;

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glUniformMatrix4fv(
    modelview_uniform, 1, GL_FALSE, glm::value_ptr(modelview));
glUniformMatrix4fv(
    projection_uniform, 1, GL_FALSE, glm::value_ptr(projection));

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer(
    position_attribute,
    3,
    GL_FLOAT,
    GL_FALSE,
    0,
    (void*)0);
glEnableVertexAttribArray(position_attribute);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer);
glDrawElements(
    GL_TRIANGLES,
    monkey_mesh.indices.size(),
    GL_UNSIGNED_INT,
    (void*)0);

glDisableVertexAttribArray(position_attribute);

glutSwapBuffers();
我通过调用
glgetAttriblLocation(程序,“位置”)获得
position\u属性
。它在两种情况下都包含正确的值(第一种情况下为1,第二种情况下为0)


我做错什么了吗?我确信我能够在
location==0
时进行渲染,这仅仅是因为我很幸运,而且数据完全是靠运气写在那里的,但我一辈子都不知道我错过了哪一步

你所看到的是不可能的。GLSL版本1.10根本不支持
布局
语法。因此,编译器应该拒绝着色器。因此,您的编译器没有拒绝着色器,因此已损坏,或者您没有加载您认为是的着色器

如果在使用GLSL版本3.30或更高版本(第一个支持属性索引的
布局(location=#)语法的核心版本)时它仍然不起作用,那么您看到的是另一个错误的结果。即,兼容性配置文件隐式声明,要使用顶点数组进行渲染,必须使用属性零或
gl\u-vertex
。核心概要文件没有此类限制。然而,这个限制在GL中已经存在了一段时间,所以一些实现仍然会强制执行它,即使在核心概要文件中它并不存在


所以只需使用属性0。或者,如果您还没有使用核心配置文件,也可以切换到核心配置文件(尽管如果一个实现确实正确地实现了这一区别,我会感到惊讶。一般来说,它要么在兼容性方面过于宽松,要么在核心方面过于严格)。

除了
#version 110
之外,它看起来非常正确。。。(在版本110中,没有
位置
布局说明符,但由于它是向前兼容的…(至少我认为是这样),这应该不是问题)。@BartekBanachewicz删除或更改版本说明符也不能解决问题。我迷路了!这就是为什么我说“出人意料”。对于这种情况,我(以及其他人)通常怀疑驱动程序中仍然存在的固定属性绑定的残余。您使用的是核心上下文吗?具体是哪个版本?IIRC显式attrib位置在3.3中出现,所以这可能是一个好的开始。@BartekBanachewicz我正在用GLEW设置它,并检查
GLEW_VERSION_3_3
?他们因移动属性位置而臭名昭著。所以我对固定属性位置的兼容性问题是正确的!我切换到了
#version 330
,删除了布局指令,得到了预期的结果。谢谢你的帮助,我不想马上指责实现太快,但似乎我的代码根本不是问题所在。@pwny:不,是你的代码;您不能使用
#版本330
。此外,您不应该停止使用layout location指令。只需确保所有着色器都使用属性0即可。OpenGL不需要自动为位置0分配属性。@Nicolas Ok,所以如果我理解正确,我仍然应该使用位置指令,但请确保从0开始。位置是否也应该按顺序排列,或者我可以选择
0、2、3