OpenGL - 同一对象的不同表面上的不同纹理

Mik*_*old 3 opengl textures texturing

我正在尝试为我正在使用OpenGL制作的游戏画一辆车.car对象存储在带有.mtl文件的.obj文件中.

这款车有500多个顶点,100多个面,需要超过50种不同的纹理,使用我自己的顶点和片段着色器.我通过使用缓冲区对象来解决这个问题,缓冲区对象立即发送有关我的对象的所有信息.我的问题是尝试将不同的纹理应用于同一对象的不同表面.

我发现这个问题的答案是将纹理绑定到某个纹理编号(即GL_TEXTURE0,GL_TEXTURE1等等),并将Sampler2D传递给引用它的片段着色器.但是,我可以用这种方式存储50多个纹理吗?据我所知,它归于GL_TEXTURE32.

另外,我如何告诉着色器仅将纹理应用于汽车对象的某个面?

Nic*_*las 8

您不能以这种方式渲染模型,一次绑定所有纹理.片段着色器,即使对于高端GL 4.1级硬件,也只能访问16个纹理.也就是说,它只能有16个采样器.

总纹理数量更高,因为其他着色器阶段也可以使用纹理.

处理它的正确方法是执行以下操作之一:

  1. 返回建模器并让它们减少模型的纹理数量.
  2. 让工具构建纹理图集(即:将所有图像放入单个纹理中),适当地更改模型的纹理坐标.根据您计划支持的硬件,这可以是大型2D纹理或2D纹理阵列.后者将需要纹理坐标的第3个值:数组中图像的索引.
  3. 按纹理对三角形进行排序.对于每个纹理,渲染使用该纹理的所有三角形.

#3是唯一不需要更改数据的解决方案.但要注意:如果你经常渲染这款车(比如每帧数千次),状态变化开销可能是性能问题.#1和#2的某种组合是通常优选的方法.

顺便说一句,如果你的模型只有几百个面,但有50个纹理,那么很可能在建模过程中出现了可怕的错误.