Я сделал отображение окружения с кубическими картами и теневым отображением в одном направлении с 2D-текстурой, но использование кубической карты для теневого отображения во всех направлениях доставляет мне много проблем.
Я недавно нашелиз-за того, что значение глубины, которое я получал от textureCube()
, всегда было нулевым.Я предполагал, что эта линия работает, так как я использовал код, аналогичный коду окружения и теневому отображению для 2D-текстуры, а также потому, что gDEBugger показывает, что карта теней правильно копируется в память.
Вот частькода шейдера для сопоставления теней вместе с моими тестами отладки ...
uniform samplerCube shadowMap;
varying vec3 worldFragPosition, worldLightPos;
...
vec3 lightToFrag;
float shadowMapDepth;
bool inShadow;
inShadow = false; //used to darken color at the end
if (shadowMapEnabled)
{
lightToFrag = worldFragPosition - worldLightPos;
shadowMapDepth = textureCube(shadowMap, lightToFrag).r;
if (shadowMapDepth > .75)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0);
return;
}
else if (shadowMapDepth > .5)
{
gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
return;
}
else if (shadowMapDepth > .25)
{
gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0);
return;
}
else if (shadowMapDepth > 0.0)
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
return;
}
else if (shadowMapDepth < 0.0)
{
gl_FragColor = vec4(1.0, 0.0, 1.0, 0.0);
return;
}
else
{
//... shadow mapping code
}
}
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * всегда отбирается, и сцена визуализируется с использованием разбитого кода 'Shadow Map Mapping (в настоящее время все находится в тени по сравнению сглубина равна нулю).
Ранее я проверял lightToFrag
, чтобы убедиться, что он не равен нулю, и явно проверял shadowMapDepth
против нуля (несмотря на то, что он является плавающим).Я также проверил полное возвращаемое значение textureCube(shadowMap, lightToFrag)
, чтобы убедиться, что это нулевой вектор.
Единственное, что я могу думать о том, почему глубина всегда равна нулю, будет, если текстура не связанаправильно, но я не думаю, что я что-то забываю ...
samplerShadowMapLoc = glGetUniformLocation(progId, "shadowMap");
shadowMapEnabledLoc = glGetUniformLocation(progId, "shadowMapEnabled");
....
glUniform1i(shadowMapEnabledLoc, true);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_CUBE_MAP, light->getShadowMap()->getShadowMapId());
glUniform1i(samplerShadowMapLoc, 3);
for (unsigned int i=0; i < objects.size(); i++)
if (objects.at(i)->getID() != light->getParent()->getID()) //don't draw light, it doesn't need shadows
render(objects.at(i));
glUniform1i(shadowMapEnabledLoc, false);
render(light->getParent());
glUniform1i(shadowMapEnabledLoc, false);
Что может заставить textureCube возвращать нулевой вектор?Любая помощь будет оценена.