Если я правильно понимаю FBOs, я могу прикрепить несколько 2D-текстур к различным точкам привязки цвета. Я хотел бы использовать эту возможность для записи нескольких разных типов данных из фрагментарного шейдера (например, мировое положение и нормали). Похоже, что в старые времена это связано с написанием gl_FragData по разным индексам, но gl_FragData больше не существует. Как это делается сейчас?Как рендеринг нескольких текстур работает в современном OpenGL?
0
A
ответ
4
Вы можете просто добавить выходные переменные в свой шейдер фрагмента. Вот пример:
layout(location=0) out vec4 color;
layout(location=1) out vec3 normal;
layout(location=2) out vec3 position;
void main() {
color = vec4(1,0,0,1);
normal = vec3(0,1,0);
position = vec3(1,2,3);
}
2
Как сказал дари, вы можете использовать layout(location=0)
спецификатор.
Другой метод, чтобы назначить место за пределами шейдера заключается в использовании:
glBindFragDataLocation(_program, 0, "color");
Тогда в шейдере:
out vec4 color;
Смотрите это для более подробного обсуждения выходных буферов: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers
Это примерно работает, но я поразил некоторые странности: если альфа-смешивание включено, выходы COLOR_ATTACHMENTi должны быть vec4, так что альфа может быть установлена t o отличное от нуля. Мне также не удалось заставить 'int' или' ivec' работать вообще (мое ужасное решение - бросить все на float). – bfops