Должен ли квантификатор макета (местоположение) различаться между юниформой/входом/выходом?

Сейчас я настраиваю квантификатор макета (местоположение) для своих шейдеров GLSL. И этот вопрос поражает меня, должны ли эти идентификаторы квантификатора отличаться друг от друга.

Должно ли быть:

layout (location = 0) uniform vec3 v1;
layout (location = 1) in vec3 v2;
layout (location = 2) uniform vec3 v3;
layout (location = 3) in vec3 v4;

Или это может быть (поскольку местоположение может быть указано как униформа или входы):

layout (location = 0) uniform vec3 v1;
layout (location = 0) in vec3 v2;
layout (location = 1) uniform vec3 v3;
layout (location = 1) in vec3 v4;

Спасибо.


person Haotian Liu    schedule 23.07.2017    source источник


Ответы (1)


В то время как для атрибутов вершинного шейдера расположение макета — это индекс атрибута, расположение макета для юниформ-переменных — это юниформ-положение. Это разные вещи.

Если вы не зададите явные местоположения макета и прочитаете местоположения после компоновки шейдерной программы, вы увидите, что они оба могут находиться в одном диапазоне. Это можно сделать с помощью glGetAttribLocation и glGetUniformLocation

Оба ваших варианта правильны и возможны. Расположение атрибутов должно быть уникальным, а единые местоположения должны быть уникальными. Но они не должны быть однозначными, кроме типа индекса местоположения.

Для получения более подробной информации о квалификаторе макета я рекомендую документацию по OGL и GLSL от Khronos Group: Классификатор макета (GLSL)

См. соответственно Основной профиль API OpenGL 4.6. Спецификация - 7.3.1 Программные интерфейсы.

Каждой записи в списке активных ресурсов для интерфейса присваивается уникальный целочисленный индекс без знака в диапазоне от 0 до N − 1, где N — количество записей в активном список ресурсов.

В то время как тип интерфейса для юниформ-переменных — UNIFORM, тип для атрибутов — PROGRAM_INPUT. Расположение различных ресурсов программы можно получить с помощью инструкции glGetProgramResourceLocation< /a> по типу интерфейса программы и имени.

person Rabbid76    schedule 23.07.2017
comment
Спасибо, это так! - person Haotian Liu; 23.07.2017