2015-09-27 6 views
0

Если я правильно понимаю FBOs, я могу прикрепить несколько 2D-текстур к различным точкам привязки цвета. Я хотел бы использовать эту возможность для записи нескольких разных типов данных из фрагментарного шейдера (например, мировое положение и нормали). Похоже, что в старые времена это связано с написанием gl_FragData по разным индексам, но gl_FragData больше не существует. Как это делается сейчас?Как рендеринг нескольких текстур работает в современном OpenGL?

ответ

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); 
} 
+0

Это примерно работает, но я поразил некоторые странности: если альфа-смешивание включено, выходы COLOR_ATTACHMENTi должны быть vec4, так что альфа может быть установлена ​​t o отличное от нуля. Мне также не удалось заставить 'int' или' ivec' работать вообще (мое ужасное решение - бросить все на float). – bfops

2

Как сказал дари, вы можете использовать layout(location=0) спецификатор.

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

glBindFragDataLocation(_program, 0, "color"); 

Тогда в шейдере:

out vec4 color; 

Смотрите это для более подробного обсуждения выходных буферов: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers