如何将多个纹理绑定到使用`glDrawRangeElements()`绘制的基元?

时间:2015-08-01 07:48:34

标签: opengl texture-mapping

我使用glDrawRangeElements()绘制纹理四边形(作为三角形)。我的问题是我只能在该函数调用之前绑定一个纹理,因此所有四边形都使用相同的纹理绘制。

如何为每个四边形绑定不同的纹理? 使用glDrawRangeElements()功能时可以这样做吗?如果没有,我应该看看其他什么OpenGL功能?

1 个答案:

答案 0 :(得分:2)

首先,您需要访问片段着色器中的多个纹理。要执行此操作,您可以使用:

Arrays Textures - 基本上是3D纹理,其中第三维是不同2D纹理图层的数量。限制是数组中的所有纹理必须具有相同的大小。也可以使用立方体贴图纹理( GL 4.0及更高版本)堆叠多个纹理。

Bindless textures - 这些只能在相对较新的硬件上使用。对于Nvidia而言,这是Kepler及更高版本。因为无绑定纹理本质上是指向GPU上纹理内存的指针,你可以用数千个填充数组或统一缓冲区那些然后索引到片段着色器中的那个数组,可以直接访问采样器对象。

现在,你如何为每个基元索引这些数组?有很多种方法。首先,如果你多次渲染相同的基元,你可以使用instanced drawing。这里有GLSL InstanceID来跟踪原语是什么目前已绘制。 如果您不使用实例化并尝试在单个绘制调用中纹理几何体的不同部分,则会更复杂。您应该在每个顶点的基础上添加纹理索引信息。也就是说,如果几何体具有每个顶点的交错结构看起来像这样:

VTN,VTN,VTN ...其中(V-vertices,T-texture coords,N-normals),你应该添加另一组数据,让我们称之为I - (纹理索引),这样你的顶点数组就会 有结构VTNI,VTNI,VTNI ...
您还可以设置单独的顶点缓冲区,仅包含纹理索引。但对于大型几何缓冲区,它可能效率较低。交错通常允许更快的数据访问。 一旦你拥有它,你可以将纹理索引作为变化传递到片段着色器(设置为平面以确保它不被插值)并索引到特定纹理。是的,这意味着你的顶点数组将更大并包含冗余数据,但那是在单个原始级别上使用多重纹理的缺点。

希望它有所帮助。