Как говорится в заголовке, использование 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);
Что ж, после того, как я почти выдернул свои волосы, отчаянно пытаясь найти единственную подсказку о том, почему эта проблема произошла, я наконец понял это, но я не совсем уверен, почему это вызвало проблему.
Во время геометрического прохода (перед проходом освещения) модели отображаются в соответствии с положением, цветом (рассеянным), нормалями и трафаретом глубины, как и следовало ожидать. Во время этого прохода текстуру связывают (диффузная текстура меша), но только как стандартную текстуру (GL_TEXTURE_2D) в нулевом блоке (GL_TEXTURE0) (сейчас я использую только диффузию).
Я оставил это так, как работала система, потому что проход освещения переопределяет этот блок, когда он связывает четыре текстуры FBO для чтения. Тем не менее, в мультисэмплинговом FBO они были связаны как мультисэмплирующие текстуры (GL_TEXTURE_2D_MULTISAMPLE), и просто случается, что карта «позиции» использовала нулевой блок (GL_TEXTURE0).
По какой-то причине это не переписало ранее связанный блок из прохода геометрии и вызвало ошибку GL_INVALID_OPERATION. После звонка:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
сразу после прохождения геометрии проблема ушла.
Вопрос, который я задаю, сводится к тому, чтобы спросить: «Почему это не перезаписать?»
Других решений пока нет …