Неверное расположение атрибутов в вершинном шейдере - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь найти расположение моих атрибутов в моем вершинном шейдере. Когда я печатаю местоположения, я получаю 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 Ответ

1 голос
/ 10 июня 2019

Вы не получите местоположение для aNormal, потому что aNormal не является активным программным ресурсом, потому что оно не "используется" в вершинном шейдере. Таким образом, драйвер оптимизирует атрибут aNormal и не получает индекс атрибута.
Если вы не используете TexCoords в фрагментном шейдере, то же самое относится и к aTexCoords, если TexCoords не «используется», то aTexCoords тоже не «используется».

См. Спецификация профиля ядра OpenGL 4.6 - 7.3.1 Программные интерфейсы , стр. 102:

7.3.1 Программные интерфейсы

Когда программный объект становится частью текущего состояния рендеринга, его исполняемый код может связываться с другими этапами конвейера GL или кодом приложения через множество интерфейсов. Когда программа связана, GL формирует список активных ресурсов для каждого интерфейса. Примеры активных ресурсов включают переменные, блоки интерфейса и подпрограммы, используемые кодом шейдера. Ресурсы, на которые есть ссылки в шейдерном коде, считаются активными, если только компилятор и компоновщик не могут окончательно определить, что они не оказывают заметного влияния на результаты, создаваемые исполняемым кодом программы.


код

loc_pos = glGetAttribLocation( shader_program, "TexCoords" );

возвращает -1, потому что "TexCoords" не является именем атрибута. Имя атрибута "aTexCoords", а не "TexCoords".

...