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

时间:2013-07-28 20:05:58

标签: 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) attribute vec3 position;

layout(location = 0) attribute vec3 position;

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

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

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

我有什么问题吗?我确信我只能在location == 0时才能渲染,因为我很幸运,而且数据是靠纯粹的运气写在那里的,但我无法弄清楚我的生活中我缺少哪一步。

1 个答案:

答案 0 :(得分:2)

你所看到的是不可能的。 GLSL版本1.10根本不支持layout语法。所以你的编译器应该拒绝着色器。因此,您的编译器不会拒绝着色器而因此被破坏,或者您没有加载您认为自己的着色器。

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

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