3

我正在使用 OpenGL 并在我的程序中绘制各种几何形状(正方形、三角形等),每个对象具有不同的纹理。

我测试了使用 VBO 和着色器执行渲染,这很好地为每个对象创建了一个 VBO。当大量对象(150 到 200 之间)时会出现问题......这意味着对函数的调用非常多glDrawElements()

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

我发现最好的方法是创建一个包含所有要绘制的顶点(顶点、纹理坐标、索引等)的单个 VBO。

这样做的问题是我不能为每个对象使用不同的纹理,因为 VBO 绘制所有几何图形一次。

问题是.. 执行我需要的最佳方式(最佳方式)是什么?不使用已被弃用为glBegin ()/glEnd ()或的函数或方法glDrawArrays ()(我正在使用 open GL 3.0 及更高版本)。

PD:我使用 OpenGL 和 C++。

4

2 回答 2

4

如果你想先用一个纹理渲染一个 VBO,然后再用另一个:

  1. 绑定第一个纹理
  2. 渲染 VBO
  3. 绑定第二个纹理
  4. 再次渲染 VBO

如果你想用一种纹理绘制 VBO 的一部分,用另一种纹理绘制一部分,你有几个选择:

  • 将您的 VBO 拆分为两个独立的 VBO 并分别渲染它们,
  • 将两个纹理合并为一个更大的纹理,并相应地调整纹理坐标,或
  • 使用阵列纹理并在着色器中选择正确的图层。如果您的目标硬件支持,这可能是您的最佳选择。为了获得更大的灵活性,请考虑稀疏纹理数组。
于 2013-09-17T19:54:38.680 回答
2

使用平铺纹理

在一个纹理图像中的含义您有更多对象的纹理。有时它也被称为纹理图集。所以相应地改变纹理坐标。

如果在单个图像中使用 4x4 纹理,则单个VBO中可以有 16 个不同的对象。当然,您会受到您想要使用的纹理图像的最大尺寸和纹理质量的限制。

3D 纹理和纹理数组

随着 gfx HW 的发展,现在也可以使用 3D 纹理和纹理数组,因此您现在可以为每个对象拥有一片纹理……无需在纹理之间切换……

于 2013-09-17T19:27:32.160 回答