2D精灵的OpenGL ES阴影

时间:2012-03-07 13:45:53

标签: android ios graphics opengl-es

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

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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