具有使用OpenGL和GLSL的简单硬阴影映射技术的小工件

问题描述 投票:1回答:2

由于我使用的纹理的颜色偏暗(这些伪影不可见),我的硬阴影有一个以前从未见过的奇怪行为。这是我的问题的屏幕快照,其中包含3种不同的阴影贴图分辨率:

1)阴影贴图160 * 120

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9qU05iOC5wbmcifQ==” alt =“在此处输入图像描述”>

如您所见,立方体表面上有某种牙齿。

这里是从灯光位置看的场景视图:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9IVmJsRC5wbmcifQ==” alt =“在此处输入图像描述”>

这里是阴影图:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS94cUhpYS5wbmcifQ==” alt =“在此处输入图像描述”>

2)阴影贴图640 * 480

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9qRUpGUy5wbmcifQ==” alt =“在此处输入图像描述”>

分辨率越高,伪影就越不可见,因为阴影贴图带来了更高的精度。

这里是从灯光位置看的场景视图:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS92ZEUxMS5wbmcifQ==” alt =“在此处输入图像描述”>“ >>

这里是阴影图:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS96RHg4eS5wbmcifQ==” alt =“在此处输入图像描述”>

我尝试使用更高的其他分辨率。当然,伪像越来越小,但是如果在表面上放大,它们仍然可见。

这是第二遍在片段着色器中使用的代码:

[...]

uniform sampler2DShadow ShadowSampler[MAX_LIGHT_COUNT];

[...]

float GetDynamicShadowBias(vec3 normalDir_cs, vec3 lightDir_cs)
{
    float cosTheta = clamp(dot(normalDir_cs, lightDir_cs), 0.0f, 1.0f);
    float bias = 0.005f * tan(acos(cosTheta));

    return (clamp(bias, 0.0f, 0.01f));
}

float GetBiased_Hard_ShadowFactor(vec3 normalDir, vec3 lightDir, int idx)
{    
    if (ShadowCoords[idx].w > 0.0f)
    {
        float bias = GetDynamicShadowBias(normalDir, lightDir);

        float LightToOccluderClipDist = texture(
            ShadowSampler[idx], ShadowCoords[idx].xyz/ShadowCoords[idx].w);

        float LightToVertexClipDist = (ShadowCoords[idx].z - bias)/ShadowCoords[idx].w;

        if (LightToOccluderClipDist < LightToVertexClipDist)
            return (0.0f);
    }
    return (1.0f);
}

所以我想知道是否有可能去除立方体边缘上的这些伪像。我尝试过阴影偏差,但没有真正的成功(有关信息,我在第一遍(深度纹理的填充)中使用FRONT_FACE剔除。)

由于我使用的纹理的颜色偏暗(这些伪影不可见),我的硬阴影有一个以前从未见过的奇怪行为。这是我的问题的屏幕截图...

opengl glsl shader fragment-shader shadow-mapping
2个回答
2
投票

这里有两件事。一个是这是标准阴影贴图的限制。因为任何给定对象的阴影都将占据地图中可能更少的像素数,所以当您将该地图投射到场景上时,这些部分可以重新放大,并且会产生锯齿。

似乎正在发生的第二件事是,您的阴影本质上是1位。它们是黑色或白色。如果您要在创建地图时以某种方式对地图进行抗锯齿处理(例如,超级采样或其他技术),它将不会那么引人注意(尽管根据我的经验,它不会完全消失)。


-1
投票

您不应该玩高分辨率游戏。您应该使用Opengl中可用的阴影改进器功能。

© www.soinside.com 2019 - 2024. All rights reserved.