При указании расположения атрибута вершины в коде шейдера layout(location = ...)
Мне не нужно выбирать места, используя glGetAttribLocation
в моей C ++ программе.
Если я не определяю местоположение в шейдере с помощью квалификаторов макета и не извлекаю их в моей программе на C ++, они назначаются автоматически. Вопрос об этом автоматическом назначении. Соответствует ли порядок порядку определения в коде шейдера?
Например, в первом шейдерном коде гарантируется ли местоположение таким же, как во втором шейдерном коде?
// first shader code
#version 330
in vec3 position;
in vec3 normal;
in vec2 texcoord;// second shader code
#version 330
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texcoord;
Кроме того, применяется ли то же правило к выходным фрагментным шейдерам? Сейчас я использую glBindFragDataLocation
чтобы получить их.
Автоматические назначения атрибутов являются произвольными; они следуют любому алгоритму, который выберет для них реализация.
Если вы не назначали местоположение атрибута, то вы не можете предполагать, что-нибудь об этом.
Нет — по крайней мере, один из известных мне драйверов сортирует атрибуты в алфавитном порядке, прежде чем присваивать им местоположения, если они не имеют явного layout
директивы. Кроме того, любой атрибут, который не используется в программе, почти наверняка будет пропущен и ему не будет назначено местоположение.
Вы можете узнать значения, которые были назначены вашим атрибутам с помощью отладчика:
positionAttribute = glGetAttribLocation(shaderProgram, "position");