全方位阴影映射

Omnidirectional Shadow Mapping

本文关键字:映射 阴影 全方位      更新时间:2023-10-16

我已经用立方体贴图和阴影贴图在一个方向上用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返回一个零向量?

只有较新的硬件支持渲染到深度立方体映射,并且您必须有最新的驱动程序。此外,您必须使用受支持的格式;检查你的卡片的规格来确定。但这是最明显的问题。

这可能不会有太大的帮助(我也想知道正确的方法来做全能阴影在一个cubemap通过,没有我能找到的信息是完整的足以帮助我),但是…

你确定你正在正确地渲染到你的立方体地图吗?根据这个问题,你需要一个几何着色器来渲染一个立方体贴图。