c++ - 当属性位置 != 0 时,着色器不输出任何内容

标签 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 = projection_matrix * eye;
}

但是,改变

layout(location = 1)属性vec3位置;

布局(location = 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();

我通过调用 glGetAttribLocation(program, "position"); 获取 position_attribute。它在两种情况下都包含正确的值(第一种情况为 1,第二种情况为 0)。

我是不是做错了什么?我确信我能够在 location == 0 时渲染,只是因为我很幸运,数据纯粹是运气写在那里的,但我无法弄清楚我的一生是什么我缺少的步骤。

最佳答案

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

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

所以只需使用属性零即可。或者,如果您还没有使用核心配置文件,则可以切换到它(尽管如果实现实际上正确实现了区别,我会感到惊讶。通常,它要么在兼容性方面过于宽松,要么在核心方面过于严格)。

关于c++ - 当属性位置 != 0 时,着色器不输出任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912343/

相关文章:

c++ - 顶点着色器的 OpenGL 属性名称

opengl - 有什么方法可以在 hlsl/glsl 片段着色器中通过图元获得片段(像素)的百分比覆盖率?

visual-c++ - GLSL 不会接受我的隐式转换

c++ - '&' 在类的一元运算符中意味着什么?

c++ - 模板变量的默认返回值

c++ - vector push_back 崩溃

OpenGL 0(84) : error C7623: implicit narrowing of type from "vec4" to "float"

c++ - 如何使用 scanf 和 ddd 调试程序?

c++ - 在帧缓冲区内渲染多采样和单采样纹理

c++ - OpenGL 乒乓球反馈纹理未完全清除自身。留下了足迹