1

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

我计划按纹理对绘制调用进行分组,因此我将传递许多顶点和 texcoords 的缓冲区,现在我想将不同的旋转角度应用于不同的四边形。有没有办法在着色器中完成它,或者我应该放弃着色器中的 mvp 矩阵并使用 cpu 执行同样的事情?

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

什么是更好的表现

(1)做CPU轮换?

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

(3) 分离绘图调用?

还有其他选择吗?

4

3 回答 3

1

Use two different objects, that is all!

There is no other workaround for rotation of part of object

Example:

A game with a tank, where you want to rotate turret and remaining-body separately. Like in your case here these two are treated as separate objects.

于 2012-08-05T16:08:15.730 回答
1

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

绘图批处理是一件好事,但是,如果您被迫保留一个附加属性(因为您肯定不能使用制服来完成,您将不会拥有单个实体的信息),那么这是不值得的。

一个额外的属性意味着更多的内存带宽使用,这通常是当今系统性能的主要扼杀因素。

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

  1. GPU OpenGL驱动优化
  2. GPU 瓦片配置
  3. 我们正在讨论的形状/绘制调用的数量(如果屏幕上有 20 个四边形,为什么还要麻烦批处理?:))

换句话说,通常更方便的是放弃极端批处理以支持易用性/主要可维护性,并避免针对简单需求(如轮换)的花哨解决方案。

我希望这在某种程度上有所帮助。

于 2012-08-03T07:05:47.260 回答
1

这是一种可能性:

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

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

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

于 2012-08-03T02:15:53.913 回答