Гарантируется ли автоматическое назначение атрибутов вершин в правильном порядке?

При указании расположения атрибута вершины в коде шейдера 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 чтобы получить их.

2

Решение

Автоматические назначения атрибутов являются произвольными; они следуют любому алгоритму, который выберет для них реализация.

Если вы не назначали местоположение атрибута, то вы не можете предполагать, что-нибудь об этом.

3

Другие решения

Нет — по крайней мере, один из известных мне драйверов сортирует атрибуты в алфавитном порядке, прежде чем присваивать им местоположения, если они не имеют явного layout директивы. Кроме того, любой атрибут, который не используется в программе, почти наверняка будет пропущен и ему не будет назначено местоположение.

2

Вы можете узнать значения, которые были назначены вашим атрибутам с помощью отладчика:

positionAttribute = glGetAttribLocation(shaderProgram, "position");
1
По вопросам рекламы [email protected]