我正在尝试为使用 OpenGL 制作的游戏绘制汽车。汽车对象存储在一个带有 .mtl 文件的 .obj 文件中。
这辆车有 500 多个顶点,100 多个面,需要使用我自己的顶点和片段着色器应用超过 50 种不同的纹理。我已经通过使用缓冲区对象来解决这个问题,它一次发送有关我的对象的所有信息。我的问题是尝试将不同的纹理应用于同一对象的不同表面。
我发现这个问题的答案是将纹理绑定(bind)到某个纹理编号(即 GL_TEXTURE0、GL_TEXTURE1 等...)并将 Sampler2D 传递给引用它的片段着色器。但是,我可以用这种方式存储超过 50 个纹理吗?据我所知,它转到 GL_TEXTURE32。
另外,我如何告诉着色器仅将纹理应用于汽车对象的某个面?
最佳答案
您不能以这种方式渲染模型,您可以一次绑定(bind)所有纹理。一个片段着色器,即使对于高端的 GL 4.1 级硬件,也只能访问 16 个纹理。也就是说,它只能有 16 个采样器。
总纹理计数更高,因为其他着色器阶段也可以使用纹理。
处理它的正确方法是执行以下操作之一:
#3 是唯一不需要更改数据的解决方案。但请注意:如果您经常渲染这辆车(例如,每帧数千次),则状态更改开销可能是性能问题。 #1 和#2 的某种组合是通常首选的方法。
顺便说一句,如果您的模型只有几百个面,但有 50 个纹理,那么建模过程中可能出现了严重错误。
关于OpenGL - 同一对象的不同表面上的不同纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6788380/