Вопрос или проблема
Если в OpenGL FBO предусмотрены несколько цветовых целей с GL_COLOR_ATTACHMENT0
по GL_COLOR_ATTACHMENT31
, но только одна цель глубины/трафарета с GL_DEPTH_STENCIL_ATTACHMENT
, то как мне можно будет хранить информацию о глубине для нескольких цветовых целей? Если я рендерю две разные сцены на два разных цветовых целевых места в одном FBO, мне действительно нужны будут две разные цели глубины/трафарета для хранения информации о глубине для каждой из двух цветовых целей, правильно? Как мне этого добиться? Я просто запутался, почему предусмотрена только одна цель глубины/трафарета, в то время как может быть несколько цветовых целей в одном FBO.
Несколько цветовых привязок не предназначены для рендеринга разных сцен или вьюпортов. Они предназначены для хранения нескольких выходных данных из одного прохода рендеринга, что означает, что им нужно только одно буфер глубины.
Рендеринг нескольких сцен или вьюпортов потребует (в дополнение к дополнительному буферу глубины) также другого прохода рендеринга, что также означает, что тест глубины, все шейдеры, тесты трафарета и все остальное в конвейере рендеринга будут выполняться отдельно. Не будет никакого преимущества в рендеринге сцены на разные цветовые привязки одного и того же FBO по сравнению с рендерингом на разные FBO.
В отличие от этого, разрешение нескольких цветовых выводов из одного прохода рендеринга обеспечивает значительные улучшения производительности по сравнению с рендерингом одного и того же вьюпорта дважды, потому что все этапы (шейдер, растеризация, тест глубины) выполняются только один раз. Множественные цветовые выводы часто используются для специальных эффектов, например, для вывода нормалей или вывода векторов движения для размытия движения. Они также используются при реализации отложенного затенения.
Ответ или решение
Вопрос о хранении глубинной информации для нескольких цветных целевых объектов при использовании FBO в OpenGL действительно актуален. Важно понимать, что механика, позволяющая использовать несколько цветовых привязок, нацелена на оптимизацию обработки графики в одном проходе рендеринга, а не на рендеринг различных сцен.
Когда вы используете несколько цветовых привязок в FBO (например, GL_COLOR_ATTACHMENT0
до GL_COLOR_ATTACHMENT31
), все эти привязки предназначены для хранения различных выходных данных из одной и той же операции рендеринга. В этом контексте вам нужен только один буфер глубины, такой как GL_DEPTH_STENCIL_ATTACHMENT
, поскольку все привязки цветового буфера принадлежат одной и той же сцене и используют общие параметры глубины и тени.
Если у вас есть необходимость рендерить два разных сцены, то вам стоит рассмотреть возможность использования различных FBO. Каждый FBO может иметь свою собственную привязку глубины и цветов, что позволит вам корректно сохранить информацию о глубине для каждой сцены. Каждая сцена будет рендериться в отдельном проходе, что дает вам гибкость настройки и контроля без ограничений, связанных с одной привязкой глубины.
Важно помнить, что использование нескольких цветовых привязок полезно в следующих сценариях:
- Выходные данные для постобработки (например, нормали и векторы движения для эффектов размытия);
- Реализация отложенного рендеринга (deferred shading), где цвет, нормали и дополнительная информация хранятся в разных буферах и обрабатываются позже.
Если вы пытаетесь разрешить конфликт, возникший при попытке рендерить разные сцены в один и тот же FBO, лучше будет создать несколько FBO с индивидуальными глубинными буферами для каждой сцены. Этот подход обеспечивает большую гибкость и возможность точной настройки глубины для каждой сцены.
Таким образом, совместимость механизма рендеринга с многопоточностью и эффективностью позволяет вам сосредотачиваться на состоянии единственного прохода рендеринга, оптимально распределяя ресурсы и минимизируя накладные расходы.