我已经使用立方体贴图完成了环境贴图,并使用 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
}
}
始终采用else
并使用损坏的阴影映射代码渲染场景(当前一切都在阴影中,因为比较的深度为零)。
我之前已经测试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 返回零向量?任何帮助,将不胜感激。