我正在为我的2D游戏引擎添加一个OpenGL渲染器,我想知道是否有办法在单个绘制调用中将mvp矩阵仅应用于部分顶点?
我打算用纹理对绘制调用进行分组,这样我就会传递一个包含许多顶点和texcoords的缓冲区,现在我想将不同的旋转角度应用到不同的四边形。有没有办法在着色器中完成它或者我应该放弃着色器中的mvp矩阵并使用cpu执行相同的操作?
编辑:如何为每个顶点添加3个浮点属性(rotation和rot_center.xy)?
什么是更好的表现
(1)做CPU旋转?
(2)每个顶点提供3个浮点数
(3)分离绘制调用?
还有其他选择吗?
答案 0 :(得分:1)
这是一种可能性:
在顶点着色器中进行旋转。传递创建旋转矩阵作为顶点属性所需的信息(角度?)。
传入一个顶点属性(ubyte),它实际上是一个每顶点布尔标志。只有在设置了bool时才会执行#1中的旋转。
从性能/存储角度来看,不确定上述内容是否适合您。
答案 1 :(得分:1)
我认为,虽然出于许多不同的性能原因对绘制调用进行分组是一件好事,但更改代码以满足旋转时的基本要求并不是一个好主意。
绘制批处理是一件好事,但是,如果你被迫保留一个额外的属性(因为你不能用制服做到这一点,你肯定没有单一实体的信息),这是不值得的。
附加属性意味着更多的内存带宽使用,这通常是当今系统性能的主要杀戮因素。
另一方面,绘制批处理很重要,但并不总是至关重要,这取决于许多因素,例如:
换句话说,通常更方便的是放弃极端配料以支持简易性/主要稳定性,并避免使用花哨的解决方案作为轮换的简单要求。
我希望这会有所帮助。
答案 2 :(得分:1)
使用两个不同的对象,即全部!
没有其他解决方法来轮换对象的一部分
示例:
带有坦克的游戏,你想要分别旋转炮塔和剩余身体。就像你的情况一样,这两个被视为单独的对象。