Opengl 如何将多个纹理绑定到使用“glDrawRangeElements()”绘制的基本体?

Opengl 如何将多个纹理绑定到使用“glDrawRangeElements()”绘制的基本体?,opengl,texture-mapping,Opengl,Texture Mapping,我正在使用glDrawRangeElements()绘制带纹理的四边形(作为三角形)。我的问题是,在函数调用之前,我只能绑定一个纹理,因此所有四边形都使用相同的纹理绘制 如何为每个四边形绑定不同的纹理? 在使用glDrawRangeElements()函数时是否可以这样做?如果没有,我应该看什么其他OpenGL函数?首先,您需要允许访问片段着色器中的多个纹理。要做到这一点,您可以使用: -基本上是3D纹理,其中3D是不同2D纹理层的数量。限制是数组中的所有纹理必须具有相同的大小。此外,立方体贴图

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

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

首先,您需要允许访问片段着色器中的多个纹理。要做到这一点,您可以使用:

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

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

现在,如何为每个基元索引到这些数组?有多种方法。首先,如果多次渲染相同的基元,可以使用。这里有GLSL InstanceID来跟踪当前绘制的基元。 如果不使用实例化,同时尝试在一次绘制调用中对几何体的不同部分进行纹理处理,则会更加复杂。您应该在逐顶点的基础上添加纹理索引信息。也就是说,如果几何体的逐顶点交错结构如下所示:

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

希望能有帮助