Opengl es OpenGL ES 2.0中具有不同纹理的许多对象

Opengl es OpenGL ES 2.0中具有不同纹理的许多对象,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我是OpenGL ES 2.0的新手,它的可编程管道,我正在移植一个应用程序,它可以渲染许多具有不同纹理的对象。 所以这需要为每个对象调用gldrawArray,并在调用之间更改纹理?或者有另一种方法可以使用单个glDrawArrays调用绘制具有不同纹理的多个对象 我这样问是因为我注意到,当尝试使用GLDrawArray而不是使用“桌面”OpenGL的glBegin/glEnd时,调用GLDrawArray的速度要慢得多 我正在渲染贴图平铺,因此所有纹理都是不同的,它们是动态加载的(不能像加载

我是OpenGL ES 2.0的新手,它的可编程管道,我正在移植一个应用程序,它可以渲染许多具有不同纹理的对象。 所以这需要为每个对象调用gldrawArray,并在调用之间更改纹理?或者有另一种方法可以使用单个glDrawArrays调用绘制具有不同纹理的多个对象

我这样问是因为我注意到,当尝试使用GLDrawArray而不是使用“桌面”OpenGL的glBegin/glEnd时,调用GLDrawArray的速度要慢得多


我正在渲染贴图平铺,因此所有纹理都是不同的,它们是动态加载的(不能像加载一次那样花费太多时间处理它们),而且非常大(高达512x512)。

不幸的是,没有一种简单的内置方法可以在一个批处理
glDrawArrays
调用中应用多个纹理。然而,有一些方法可以让它发挥作用。最常见的策略之一是纹理图谱。基本上,其想法是将多个图像组合成一个较大的纹理,每个子图像占据纹理的一个已知子矩形。将这些映射到基本体时,将提供与要显示的图像对应的子矩形的坐标

纹理图集在很多情况下都可以使用,但设置起来可能比较复杂。如果不必对每个对象都使用不同的纹理,那么首先要尝试的就是将尽可能多的使用相同纹理的基本体批处理在一起


如果您没有使用OpenGL ES,如果您的纹理大小相同,您也可以考虑使用纹理数组。

谢谢。不幸的是,我不认为我可以使用atlas,因为我的纹理非常大(256x256-512x512),将4个纹理组合成一个不会有太大的区别(但需要一些时间来创建更大的纹理)。是否可以将不同的纹理绑定到设备拥有的尽可能多的纹理单元,然后在着色器中根据顶点属性选择纹理单元?是的,通过将一个纹理绑定到每个插槽,然后为每个插槽提供纹理坐标并在着色器中混合它们,可以非常简单地执行此操作,或者,通过使纹理坐标遵循某种模式,可以将它们映射到特定的窗(例如,如果纹理坐标在0.0和1.0之间,则应用于窗0中的纹理,如果纹理坐标在10.0和11.0之间,则应用于窗1中的纹理,依此类推)。我没有提到这一点,因为它将纹理的数量限制在一个相当小的数量。不过对你来说,这可能是最好的选择。谢谢!我只需要学习GLSL。。我是否正确理解GLSL中不存在“取样器阵列”,每个纹理都是单独的统一体,因此我需要一组IFs来选择合适的插槽,而不仅仅是纹理[I]?你是对的,很遗憾,GLSL中不支持取样器阵列,一连串的
if
语句可能是您能做的最好的语句。