2D精灵的OpenGL ES阴影

Jos*_*osh 13 graphics android opengl-es ios

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

在此输入图像描述

场景使用正交投影,精灵是纹理四边形,我使用深度缓冲区从前到后绘制它们.我正在使用OpenGL ES 2.0,但是来自iOS或非ES世界的想法也会受到赞赏.我在脑子里想了几个关于如何解决这个问题的想法,我想知道哪个最有希望.

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

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

那么这些比其他更好吗?还有其他我没想过的选择吗?谢谢!

Ani*_*Ani 5

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

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

希望这可以帮助!