首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在着色器中绘制2D阴影

在着色器中绘制2D阴影
EN

Game Development用户
提问于 2017-06-11 21:12:47
回答 1查看 3.1K关注 0票数 3

更新:

通过修改着色器,我得到了更好的效果,使它在进入模糊区域时设置了一个标志,然后只有在光线投射退出模糊区域时,才会将片段设置为黑色。这样的话,边缘的光线就不那么明显了。此外,其他对象后面的对象现在将正确地模糊,只要他们没有接触。

然而,正如你在图片中所看到的,我注意到了一个新的问题。由于我的光线投射方式,阴影在后面变得非常起伏。

原件:

我目前正试图在一个2d游戏中渲染阴影。我使用以下着色器这样做:

代码语言:javascript
复制
#version 120
varying vec2 vTexCoord;

uniform vec3 u_lightColor;
uniform sampler2D u_texture;


float drawShadow(){
    vec2 loc;
    vec2 norm = normalize(vTexCoord - vec2(.5,.5)); // Pointing from center to point
    vec4 smp;

    float dst = 0.0;

    // For now draw all casters
    if(texture2D(u_texture, vTexCoord - dst * norm).a > 0)
        return 1.0;

    for(int i = 0; i < 256; i++){
        loc = vTexCoord - dst * norm;

        if (length(loc-vec2(.5,.5)) < 1.0/256.0)
            break;

        smp = texture2D(u_texture, loc);

        if(smp.a > 0){
            return 0.0;
        }

        dst += 1.0/256.0;
    }

    return 1.0;
}


void main() {
    float dist = length(vec2(.5,.5) - vTexCoord.xy);

    float shad = drawShadow();

    float intensity = 1-dist*2.0;

    gl_FragColor = vec4(u_lightColor, 1.0)*vec4(shad*vec3(intensity), shad);
}

光线呈现在屏幕的中心,所绘制的纹理是任何阴影施法者都被绘制为非透明精灵的纹理。

问题在于我发出射线的方式,我的结果是:

那里的阴影不拥抱精灵的边缘。另外,如果阴影施法者在另一个暗影施法者的阴影中,我想在某种程度上模糊他们的影子施法者,而不是如果他们是第一个施法者光的命中者。

EN

回答 1

Game Development用户

发布于 2017-10-23 08:06:57

2D阴影的一种完全不同的方法是在CPU上或可能在几何图形着色器中制作动态网格,并使用它与模板掩码一起进行阴影处理。

我建议查看这个网站:https://www.redblobgames.com/articles/visibility/,以获得来自网格的2D可见性。

我还尝试在着色器中实现您的解决方案:

我不得不把步数提高到32768,然后才能降到60英尺以下。因此,也许你可以通过增加步骤的数量来减少你的混叠问题。

在写这个答案的时候,我找到了一种方法来平滑阴影中的阴影。这是假的,但可能有用:

https://www.shadertoy.com/view/XlByDm

票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/142345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档