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

时间:2019-06-10 09:28:06

标签: c++ opengl glsl shader

我试图在我的顶点着色器中找到属性的位置。当我打印位置时,得到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 个答案:

答案 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"