更新:
通过修改着色器,我得到了更好的效果,使它在进入模糊区域时设置了一个标志,然后只有在光线投射退出模糊区域时,才会将片段设置为黑色。这样的话,边缘的光线就不那么明显了。此外,其他对象后面的对象现在将正确地模糊,只要他们没有接触。
然而,正如你在图片中所看到的,我注意到了一个新的问题。由于我的光线投射方式,阴影在后面变得非常起伏。
原件:
我目前正试图在一个2d游戏中渲染阴影。我使用以下着色器这样做:
#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);
}
光线呈现在屏幕的中心,所绘制的纹理是任何阴影施法者都被绘制为非透明精灵的纹理。
问题在于我发出射线的方式,我的结果是:
那里的阴影不拥抱精灵的边缘。另外,如果阴影施法者在另一个暗影施法者的阴影中,我想在某种程度上模糊他们的影子施法者,而不是如果他们是第一个施法者光的命中者。
发布于 2017-10-23 08:06:57
2D阴影的一种完全不同的方法是在CPU上或可能在几何图形着色器中制作动态网格,并使用它与模板掩码一起进行阴影处理。
我建议查看这个网站:https://www.redblobgames.com/articles/visibility/,以获得来自网格的2D可见性。
我还尝试在着色器中实现您的解决方案:
我不得不把步数提高到32768,然后才能降到60英尺以下。因此,也许你可以通过增加步骤的数量来减少你的混叠问题。
在写这个答案的时候,我找到了一种方法来平滑阴影中的阴影。这是假的,但可能有用:
https://gamedev.stackexchange.com/questions/142345
复制相似问题