У меня есть 5 целей рендеринга. Я использую тот же шейдер для записи в первые 4, а затем в отдельном проходе пишу в последний.
Прежде чем вызывать рендеринг для первых 4 целей, я звоню:
GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, drawBuffers);
Однако, когда я вызываю его для второго прохода и хочу записать только последний, 5-й объект, почему следующее дает странные результаты?
GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT4 };
glDrawBuffers(1, drawBuffers);
Почему я должен вместо этого использовать:
GLenum drawBuffers[] = { GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT4 };
glDrawBuffers(5, drawBuffers);
Это просто, как работает glDrawBuffers (), или это вызвано чем-то другим?
РЕДАКТИРОВАТЬ: исправлен код с учетом комментариев Jarrods
Да это просто как glDrawBuffers
работает. Но есть причина для этого.
Фрагментные шейдеры записывают цветовые выходные данные, которые отображаются на определенные «цветовые числа». У них есть нет связи на номера GL_COLOR_ATTACHMENT»i ». Весь смысл glDrawBuffers
состоит в том, чтобы отобразить эти номера цветов фрагмента фактическим буферам в кадровом буфере.
http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffers.xml
2-й параметр должен иметь тип const GLenum*
то есть указатель «на массив символьных констант, определяющих буферы, в которые будут записываться цвета фрагмента или значения данных».
Так что просто проходя GL_COLOR_ATTACHMENT4
как 2-й параметр неправильного типа. Вам нужно передать указатель на массив GLEnum
,
Я считаю, что что-то не так в glDrawBuffers ().
например
tmp = {Participment_color0, Attachement_color2}
glDrawBuffers (TMP).
в шейдере:
gl_fragdata [0] = …
gl_fragdata [2] = …
или вы можете использовать расположение макета, чтобы определить вывод атрибутов.
Но иногда, по крайней мере, в моем ПК, это не работает. Я имею в виду, что attachment_color2 НЕ имеет точного вывода.