我正在尝试在iPhone上渲染大量的纹理四边形。为了提高渲染速度,我创建了一个VBO,在单个绘制调用中渲染我的对象。这似乎很有效,但我对OpenGL还不熟悉,当涉及到为每个四边形提供唯一变换时遇到了问题(最终我希望每个四边形都有自定义比例、位置和旋转)。
经过相当多的谷歌搜索,似乎处理这种情况的标准方法是向顶点着色器传递一个统一的矩阵,并让每个四边形负责渲染自己。但这种方法似乎抵消了VBO的目的,最终需要每个对象进行一次绘制调用。
在我看来,每个对象应该保留自己的模型视图矩阵,使用它来根据需要转换、缩放和旋转对象。但是将单独的矩阵应用于VBO中的对象让我感到困惑。我考虑了两种方法:
经过相当多的谷歌搜索,似乎处理这种情况的标准方法是向顶点着色器传递一个统一的矩阵,并让每个四边形负责渲染自己。但这种方法似乎抵消了VBO的目的,最终需要每个对象进行一次绘制调用。
在我看来,每个对象应该保留自己的模型视图矩阵,使用它来根据需要转换、缩放和旋转对象。但是将单独的矩阵应用于VBO中的对象让我感到困惑。我考虑了两种方法:
- 将模型视图矩阵作为非统一属性发送到顶点着色器,并在着色器内部应用它。
- 或在将顶点数据存储在VBO中并发送到GPU之前对其进行转换
glMapBufferRange
不能在ES 2.0中使用,它可以帮助你避免这种方法中的一个复制。相反,将更多的计算移动到GPU上显然很有吸引力,但你需要找出它是否适用于你的使用情况。 - Reto Koradi