【问题标题】:OpenGL ES drop shadows for 2D sprites用于 2D 精灵的 OpenGL ES 投影
【发布时间】:2012-03-25 01:12:13
【问题描述】:

我有一个用一堆精灵渲染的 OpenGL 场景,我想自动为所有精灵添加阴影。这是一张显示我的意思的图片:

场景使用正交投影,精灵是带纹理的四边形,我使用深度缓冲区从前到后绘制它们。我正在使用 OpenGL ES 2.0,但来自 iOS 或非 ES 世界的想法也会受到赞赏。我已经在我的脑海中提出了一些想法来解决这个问题,我想找出最有希望的方法。

  1. 每个精灵绘制两次,第一次正常绘制,第二次使用某种阴影着色器在场景中更深一点。不确定这是否可行?
  2. 绘制一个精灵,然后再次绘制它,将其变暗并使用一些 alpha,数次将一些随机抖动应用于顶点。这可能看起来很傻,一点也不像影子。
  3. 将没有背景的基本场景绘制到纹理上,然后对其进行模糊和变暗以创建一个大阴影。然后在阴影纹理上绘制基础场景,最后在背景上绘制。不过,这会丢失精灵之间的阴影。
  4. SSAO 在后处理过程中。可能是最动态和自动的,但可能看起来模糊/颗粒状,并且确实会减慢速度。
  5. 在创建时,为每个精灵生成一个阴影纹理。对于渲染,绘制一个精灵,然后在场景中更深地绘制它的阴影纹理。由于加载时间和额外的内存要求,我想避免这种情况,但这可能是最快和最好看的?

我不想对外部纹理进行任何阴影处理,因为我使用不同比例的相同精灵纹理,并且预烘焙的阴影会不自然地缩放。

那么这些中的任何一个都比其他的更好吗?还有其他我没有想到的选择吗?谢谢!

【问题讨论】:

  • 对于#3,您可能对 Imagination Technologies 的后处理建议感兴趣:imgtec.com/powervr/insider/docs/…,其中包含对高效布隆过滤器的描述。用仅渲染对象的深色版本来替换它们的高通滤镜应该会产生良好、快速的阴影。
  • 好书,布拉德。如果我使用#3,我可能会使用该方法。

标签: android ios graphics opengl-es


【解决方案1】:

这些都是经过深思熟虑的选项,这是我对每个选项的想法

  1. 绝对可以使用着色器,但它可能不是性能最高的选项,因为必须在着色器内部进行模糊处理,并且可能涉及多个纹理查找。
  2. 多次绘制纹理会起作用并且看起来像阴影,因为每个“抖动”的图像都会稍微修改 alpha 值。但同样,每个精灵的混合和多次渲染会累加起来,并可能影响性能。
  3. 我喜欢并推荐此选项,因为您可以设置一个着色器,将黑色像素而不是彩色像素(考虑 alpha)放入比屏幕小的渲染目标(1/4?),然后将其用作阴影纹理.由于现在正在拉伸纹理,因此您也可以免费获得“模糊”。进行“黑化”的像素着色器会非常简单,不会对性能造成太大影响。
  4. 除非您真的需要高质量的阴影(而且以前的方法不够用),否则我不会推荐这个。
  5. 这当然是最灵活的选项,并且具有 x2 渲染复杂性。不幸的是,它会比上述所有其他选项消耗更多的内存。

希望这会有所帮助!

【讨论】:

  • 与#5一起去,似乎它会给我带来最好的表现。
猜你喜欢
  • 2016-11-06
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多