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
?