我已经使用立体贴图和阴影贴图在一个方向上使用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返回零向量?任何帮助将不胜感激。
答案 0 :(得分:1)
只有较新的硬件支持渲染到深度立方体贴图,并且您必须拥有最新的驱动程序。此外,您必须使用支持的格式;检查您的卡的规格,以确保。但这是最明显的可能问题。
答案 1 :(得分:0)
这可能没有多大帮助(我也想知道使用立方体贴图在一次通过中进行全向阴影的正确方法,我找不到的任何信息都足以帮助我)但是...
您确定要正确渲染立方图吗?根据{{3}},您需要使用几何着色器渲染到立方体贴图。