OpenGL ES 2D阴影的阴影

问题描述:

我有一个OpenGL场景,呈现了一群精灵,我想自动为它们添加阴影。这里有一张展示我的意思:OpenGL ES 2D阴影的阴影

enter image description here

该场景使用正投影,精灵是纹理四边形,和我使用的深度缓冲区前吸引他们来支持。我正在使用OpenGL ES 2.0,但也会赞赏iOS或非ES世界的想法。在我的头脑中,我抛出了一些想法,我想知道哪些是最有前途的。

  1. 绘制每个精灵两次,第一次正常,第二次用某种阴影着色器在场景中更深一点。不知道这是可能的吗?
  2. 绘制一个精灵,然后再绘制一遍,变暗,并用一些阿尔法,几次与一些随机抖动应用于verticies。这可能看起来很傻,根本不像一个影子。
  3. 绘制没有背景的基础场景到纹理,然后模糊并使其变暗以创建一个大的投影。然后在阴影纹理上绘制基础场景,最后在背景上绘制。不过,这将会消失精灵之间的阴影。
  4. SSAO在后处理阶段。可能是最具动态性和自动性的,但可能会看起来模糊/颗粒感和真正缓慢的事情。
  5. 在创建时,为每个精灵生成阴影纹理。为了渲染,在场景中绘制一个精灵,然后绘制它的阴影。我想我想避免这一点,由于加载时间和额外的内存要求,但这可能是最快和最好看?

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

所以这些比其他人更好吗?有没有其他选择我没有想到?谢谢!

+0

对于#3,您可能会对Imagination Technologies的后处理建议感兴趣:http://www.imgtec.com/powervr/insider/docs/PowerVR.Post%20Processing%20Effects%20Development%20Recommendations.1.7f。 External.pdf,其中包括对高效布隆过滤器的描述。只需渲染对象的黑暗版本即可取代高通滤镜,这应该会产生良好的快速投影。 – 2012-03-07 17:04:29

+0

好读,布拉德。如果我去#3,我可以使用这种方法。 – Josh 2012-03-07 17:38:39

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

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

希望这会有所帮助!

+0

谢谢你的想法! – Josh 2012-03-07 14:27:54

+0

想要与#5一起去,似乎它会让我获得最佳表现。 – Josh 2012-03-12 15:21:05