【发布时间】:2012-03-25 01:12:13
【问题描述】:
我有一个用一堆精灵渲染的 OpenGL 场景,我想自动为所有精灵添加阴影。这是一张显示我的意思的图片:
场景使用正交投影,精灵是带纹理的四边形,我使用深度缓冲区从前到后绘制它们。我正在使用 OpenGL ES 2.0,但来自 iOS 或非 ES 世界的想法也会受到赞赏。我已经在我的脑海中提出了一些想法来解决这个问题,我想找出最有希望的方法。
- 每个精灵绘制两次,第一次正常绘制,第二次使用某种阴影着色器在场景中更深一点。不确定这是否可行?
- 绘制一个精灵,然后再次绘制它,将其变暗并使用一些 alpha,数次将一些随机抖动应用于顶点。这可能看起来很傻,一点也不像影子。
- 将没有背景的基本场景绘制到纹理上,然后对其进行模糊和变暗以创建一个大阴影。然后在阴影纹理上绘制基础场景,最后在背景上绘制。不过,这会丢失精灵之间的阴影。
- SSAO 在后处理过程中。可能是最动态和自动的,但可能看起来模糊/颗粒状,并且确实会减慢速度。
- 在创建时,为每个精灵生成一个阴影纹理。对于渲染,绘制一个精灵,然后在场景中更深地绘制它的阴影纹理。由于加载时间和额外的内存要求,我想避免这种情况,但这可能是最快和最好看的?
我不想对外部纹理进行任何阴影处理,因为我使用不同比例的相同精灵纹理,并且预烘焙的阴影会不自然地缩放。
那么这些中的任何一个都比其他的更好吗?还有其他我没有想到的选择吗?谢谢!
【问题讨论】:
-
对于#3,您可能对 Imagination Technologies 的后处理建议感兴趣:imgtec.com/powervr/insider/docs/…,其中包含对高效布隆过滤器的描述。用仅渲染对象的深色版本来替换它们的高通滤镜应该会产生良好、快速的阴影。
-
好书,布拉德。如果我使用#3,我可能会使用该方法。
标签: android ios graphics opengl-es