android - 2D Sprite 的 OpenGL ES 投影

标签 android ios graphics opengl-es

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

enter image description here

场景使用正交投影, Sprite 是带纹理的四边形,我使用深度缓冲区从前到后绘制它们。我正在使用 OpenGL ES 2.0,但来自 iOS 或非 ES 世界的想法也将受到赞赏。我已经在脑海中抛出一些关于如何解决这个问题的想法,我想找出最有希望的。

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

我不想对外部纹理做任何阴影处理,因为我在不同的比例下使用相同的 Sprite 纹理,而预烘焙的阴影会不自然地缩放。

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

最佳答案

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

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

希望这对您有所帮助!

关于android - 2D Sprite 的 OpenGL ES 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9602652/

相关文章:

c# - unity SQLite 本地数据库

android - 如何使用 ARCore Camera 拍摄带有物体的图像?

android - 多个屏幕的图像按钮大小

ios - UICollectionView 状态恢复 : restore all UICollectionViewCells

java - 类继承

iphone - CoreText 绘图、接收触摸、触摸坐标困惑

iphone - iPhone 5启动图片和App评论

python - 如何识别图像中具有相似强度的附近像素?

javascript - 以二维方式显示迷宫游戏服务的单元格

c++ - 点不会通过 OpenGl 中的键盘输入移动