只旋转部分顶点?

时间:2012-08-02 16:53:39

标签: opengl-es rotation opengl-es-2.0

我正在为我的2D游戏引擎添加一个OpenGL渲染器,我想知道是否有办法在单个绘制调用中将mvp矩阵仅应用于部分顶点?

我打算用纹理对绘制调用进行分组,这样我就会传递一个包含许多顶点和texcoords的缓冲区,现在我想将不同的旋转角度应用到不同的四边形。有没有办法在着色器中完成它或者我应该放弃着色器中的mvp矩阵并使用cpu执行相同的操作?

编辑:如何为每个顶点添加3个浮点属性(rotation和rot_center.xy)?

什么是更好的表现

(1)做CPU旋转?

(2)每个顶点提供3个浮点数

(3)分离绘制调用?

还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

这是一种可能性:

  1. 在顶点着色器中进行旋转。传递创建旋转矩阵作为顶点属性所需的信息(角度?)。

  2. 传入一个顶点属性(ubyte),它实际上是一个每顶点布尔标志。只有在设置了bool时才会执行#1中的旋转。

  3. 从性能/存储角度来看,不确定上述内容是否适合您。

答案 1 :(得分:1)

我认为,虽然出于许多不同的性能原因对绘制调用进行分组是一件好事,但更改代码以满足旋转时的基本要求并不是一个好主意。

绘制批处理是一件好事,但是,如果你被迫保留一个额外的属性(因为你不能用制服做到这一点,你肯定没有单一实体的信息),这是不值得的。

附加属性意味着更多的内存带宽使用,这通常是当今系统性能的主要杀戮因素。

另一方面,绘制批处理很重要,但并不总是至关重要,这取决于许多因素,例如:

  1. GPU OpenGL驱动程序优化
  2. GPU图块配置
  3. 我们正在谈论的形状/绘制调用的数量(如果你在屏幕上有20个四边形,你为什么要打扰批处理?:))
  4. 换句话说,通常更方便的是放弃极端配料以支持简易性/主要稳定性,并避免使用花哨的解决方案作为轮换的简单要求。

    我希望这会有所帮助。

答案 2 :(得分:1)

使用两个不同的对象,即全部!

没有其他解决方法来轮换对象的一部分

示例:

带有坦克的游戏,你想要分别旋转炮塔和剩余身体。就像你的情况一样,这两个被视为单独的对象。