2

我已经使用立方体贴图完成了环境贴图,并使用 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 返回零向量?任何帮助,将不胜感激。

4

2 回答 2

1

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

于 2011-11-05T17:52:06.093 回答
0

这可能不会有太大帮助(我也想知道使用立方体贴图一次完成全向阴影的正确方法,我能找到的信息都不足以帮助我)但是......

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

于 2011-11-11T21:52:27.947 回答