【问题标题】:LibGDX Overlapping 2D ShadowsLibGDX 重叠 2D 阴影
【发布时间】:2015-11-15 18:14:22
【问题描述】:

我正在为 2D 头顶游戏制作阴影。现在,阴影只是在图块上方的图层上绘制的颜色为 (0,0,0,0.1) 的精灵。

问题:当许多实体或树木聚集在一起时,阴影会重叠,形成看起来不自然的黑暗区域。

  

我尝试将阴影绘制到帧缓冲区并使用简单的着色器来防止重叠,但这会导致其他问题,包括分层问题。 是否可以为防止“堆叠”的阴影启用某种混合功能,或者使用着色器的更好方法?

【问题讨论】:

  • 我也一直在寻找类似的东西。我发现的有用信息很少,而且我发现的方法性能太高而无法使用。

标签: opengl libgdx shader shadow blending


【解决方案1】:

如果您不想处理排序问题,我认为您可以使用着色器来做到这一点。但是每个对象都必须受到阴影的影响。所以高大的树可以被标记为不接收阴影,而地面、草和角色将被标记为阴影接收。

首先制作一个清晰的白色帧缓冲区​​。把你所有的阴影都画成纯黑色。

然后制作一个阴影贴图着色器来绘制您世界中的一切。这取决于您不需要精灵颜色的所有四个通道,因为我们需要其中一个通道来将每个精灵标记为是否接收阴影。例如,如果您不使用 RGB 为精灵着色,我们可以使用 R 通道。或者,如果您没有将它们淡入淡出,我们可以使用 A。我在这里假设后者:

顶点着色器:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

varying vec2 v_texCoords;
varying vec2 v_texCoordsShadowmap;
varying vec4 v_color;

uniform mat4 u_projTrans;

void main()
{
    v_texCoords = a_texCoord0;
    v_color = a_color;
    v_color.a = v_color.a * (255.0/254.0); //this is a correction due to color float precision (see SpriteBatch's default shader)
    vec3 screenPosition = u_projTrans * a_position;
    v_texCoordsShadowmap = (screenPosition.xy * 0.5) + 0.5;
    gl_Position = screenPosition;
}

片段着色器:

#ifdef GL_ES
    precision mediump float;
#endif

varying vec2 v_texCoords;
varying vec2 v_texCoordsShadowmap;
varying vec4 v_color;

uniform sampler2D u_texture;
uniform sampler2D u_textureShadowmap;

void main()
{
    vec4 textureColor = texture2D(u_texture, v_texCoords);
    float shadowColor = texture2D(u_textureShadowmap, v_texCoordsShadowmap).r;
    shadowColor = mix(shadowColor, 1.0, v_color.a);
    textureColor.rgb *= shadowColor * v_color.rgb;
    gl_FragColor = textureColor;
}

这些完全未经测试,可能存在错误。确保将帧缓冲区的颜色纹理分配给“u_textureShadowmap”。对于您的所有精灵,根据您希望它们在其上投射多少阴影来设置其颜色的 alpha,通常始终为 0 或 0.1(基于您之前使用的亮度)。

【讨论】:

  • 不幸的是,我的游戏需要使用所有 4 个颜色通道。有什么办法可以解决这个问题或使用其他方法吗?
  • 我认为您将不得不对它们进行排序。但是,如果您不使用 Scene2D 或 TiledMapRenderer,我认为您可以克隆 SpriteBatch 并将其更改为包含一个额外的顶点属性。
  • 实际上,这个怎么样...在绘制阴影后将所有树木和其他高大的物体都绘制到帧缓冲区中。这里的缺点是,如果你的玩家走在树前,他们会在树干前看起来像在发光。您可能必须将所有阴影都指向远离相机的方向,而不是像现在这样指向相机。
【解决方案2】:

在禁用混合的情况下将阴影绘制到 fbo。

绘制背景,例如草 从 fbo 绘制阴影纹理 绘制所有其他精灵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2014-03-13
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多