Использование sampler2DShadow с многократными отсроченными рендерингами

Как говорится в заголовке, использование sampler2DShadow вызывает ошибку в шейдере освещения моего FBO с мультисэмплингом, но я не могу обнаружить проблему из-за наличия очень похожей конфигурации с использованием стандартной настройки отложенного рендеринга без мультисэмплинга, которая работает нормально.

Есть ли проблема совместимости с sampler2DShadow и мультисэмплингом в openlGL, или какая-то альтернатива, которую я должен использовать?

Шейдеры прекрасно компилируются.

Код работает нормально, пока я не запустил эту строку:

texture(gShadowMap2D, vec3(pCoord.xy, (pCoord.z) / pCoord.w));

и получить результат. Затем я получаю GL_INVALID_OPERATION.

Карта теней от направленного света (карта глубины действительна и видима) и использует GL_COMPARE_R_TO_TEXTURE, установленный на стандартную текстуру (GL_TEXTURE_2D).

Отложенные текстуры FBO для мультисэмплинга используют GL_TEXTURE_2D_MULTISAMPLE.

Я использую glsl 330 (профиль ядра openGL 3.3).

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

Стандартный способ:

vec3 worldPos = texture(gPositionMap, texCoord).xyz;

Мультисэмплированный способ:

vec2 texCoordMS = floor(vertTextureSize * texCoord.xy);

for(int i = 0; i < samples; i++)
{
worldPos += texelFetch(gPositionMapMS, ivec2(texCoordMS), i).xyz;
}

worldPos = worldPos / samples;

(Я опустил другие сэмплеры.)

Я предполагаю, что я за пределами, который выдает ошибку при попытке доступа к sampler2DShadow (pCoord рассчитывается с использованием worldPos).

Теперь, чтобы выяснить, как заставить этот многосэмплированный мир получить тот же результат, что и стандартным способом ???

Стандартный способ (mDepthVP = mat4 (программа просмотра глубины освещения):

vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);

0

Решение

Что ж, после того, как я почти выдернул свои волосы, отчаянно пытаясь найти единственную подсказку о том, почему эта проблема произошла, я наконец понял это, но я не совсем уверен, почему это вызвало проблему.

Во время геометрического прохода (перед проходом освещения) модели отображаются в соответствии с положением, цветом (рассеянным), нормалями и трафаретом глубины, как и следовало ожидать. Во время этого прохода текстуру связывают (диффузная текстура меша), но только как стандартную текстуру (GL_TEXTURE_2D) в нулевом блоке (GL_TEXTURE0) (сейчас я использую только диффузию).

Я оставил это так, как работала система, потому что проход освещения переопределяет этот блок, когда он связывает четыре текстуры FBO для чтения. Тем не менее, в мультисэмплинговом FBO они были связаны как мультисэмплирующие текстуры (GL_TEXTURE_2D_MULTISAMPLE), и просто случается, что карта «позиции» использовала нулевой блок (GL_TEXTURE0).

По какой-то причине это не переписало ранее связанный блок из прохода геометрии и вызвало ошибку GL_INVALID_OPERATION. После звонка:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);

сразу после прохождения геометрии проблема ушла.

Вопрос, который я задаю, сводится к тому, чтобы спросить: «Почему это не перезаписать?»

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]