繁体   English   中英

2D精灵的OpenGL ES阴影

[英]OpenGL ES drop shadows for 2D sprites

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

在此输入图像描述

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

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

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

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

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

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM