顶点着色器中属性的位置不正确

Posted

技术标签:

【中文标题】顶点着色器中属性的位置不正确【英文标题】:Incorrect Location of Attributes in Vertex Shader 【发布时间】:2019-06-10 09:28:06 【问题描述】:

我试图在我的顶点着色器中找到我的属性的位置。当我打印位置时,我得到 0、-1 和 -1。 “0”对应于 aPos 变量。即使我将 aPos 变量向下移动,它仍然会打印 0。我读到 -1 表示找不到该变量。

这是我的代码:

 // build and compile shaders
    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, &vertex_shader, NULL);
    glCompileShader(vs);
    GLint status = GL_TRUE;
    glGetShaderiv( vs, GL_COMPILE_STATUS, &status );

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, &fragment_shader, NULL);
    glCompileShader(fs);


    GLuint shader_program = glCreateProgram(); //creating joint  shader program
    glAttachShader(shader_program, fs);
    glAttachShader(shader_program, vs);
    glLinkProgram(shader_program);

    GLint loc_pos = glGetAttribLocation( shader_program, "aPos" );
    std::cout << "apos position: " << loc_pos << " ";

    loc_pos = glGetAttribLocation( shader_program, "aNormal" );
    std::cout << "normal position: " << loc_pos << " ";

    loc_pos = glGetAttribLocation( shader_program, "TexCoords" );
    std::cout << "texCoords position: " << loc_pos << " ";

这是我的顶点着色器:

#version 150 core

in vec3 aPos;
in vec3 aNormal;
in vec2 aTexCoords;


out vec2 TexCoords;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()

    TexCoords = aTexCoords;    
    gl_Position = projection * view * model * vec4(aPos, 1.0);

片段着色器:

#version 150 core
out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D texture_diffuse1;

void main()

FragColor = texture(texture_diffuse1, TexCoords);
//FragColor = vec4(1.0);

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您不会得到aNormal 的位置,因为aNormal 不是活动程序资源,因为它没有在顶点着色器中“使用”。所以驱动程序优化了属性aNormal,它没有得到属性索引。 如果在片段着色器中不使用TexCoords,那么aTexCoords也是如此,如果TexCoords没有“使用”,那么aTexCoords也没有“使用”。

参见OpenGL 4.6 Core Profile Specification - 7.3.1 Program Interfaces,第 102 页:

7.3.1 程序接口

当一个程序对象成为当前渲染状态的一部分时,它的可执行代码可以通过各种接口与其他 GL 管道阶段或应用程序代码进行通信。当一个程序被链接时,GL 为每个接口构建一个活动资源列表。活动资​​源的示例包括着色器代码使用的变量、接口块和子例程。着色器代码中引用的资源被认为是活动的,除非编译器和链接器可以最终确定它们对程序的可执行代码产生的结果没有明显的影响。


代码

loc_pos = glGetAttribLocation( shader_program, "TexCoords" );

返回 -1,因为"TexCoords" 不是属性的名称。该属性的名称是"aTexCoords",而不是"TexCoords"

【讨论】:

这是有道理的,但我在片段着色器中使用了 TexCoords,但它仍在打印 -1。我已将片段着色器添加到我的帖子中以供参考。 @SoamDesai 这是"aTexCoords",不是"TexCoords"

以上是关于顶点着色器中属性的位置不正确的主要内容,如果未能解决你的问题,请参考以下文章

在顶点着色器中定位顶点后如何更新法线?

验证顶点着色器中变换矩阵的使用。正确性或法线变换

如何在片段着色器中找到 4 个顶点之间的插值位置?

OpenGL重叠顶点属性

在顶点着色器中更改顶点的颜色

顶点纹理获取(在顶点着色器中读取纹理)