我正在制作一个对象加载器,所有纹理部件都在不同的纹理文件中。将它映射到模型上的最佳解决方案是什么? 我是否需要将每个具有自己纹理的部分视为1个模型,以便最终的主体有多个单独的绘图调用,每个部分都有一个纹理?
答案 0 :(得分:1)
随着可编程渲染管道的出现(即:着色器),您现在可以将多个纹理应用并组合到网格中,而无需多次绘制调用。
现代GPU具有多个纹理单元(glActiveTexture
),并且着色器可以一次从may单元读取。例如,您在图片中显示的右侧模型可能使用Phong光照模型的变体,其中包含漫反射纹理,normal map纹理和可能为specular map纹理亮点。所有这三个纹理当然都应用于纹理单元,整个模型在一次绘制调用中呈现。片段着色器然后读取此纹理并将它们组合以生成最终图像。
你的问题不是很具体,所以我现在就可以说了。如果您有更具体的问题,请随意提问。
答案 1 :(得分:0)
为每个需要不同纹理的部分(或纹理集,如果你需要普通地图之类的东西,如@glampert建议的那样)进行单独的绘制调用是一种可能性。你似乎有相当复杂的几何形状,所以这可能不是非常低效,因为你的绘制调用仍然会相当大。您仍然可以在单个缓冲区中拥有模型的所有顶点/索引,因此至少您不必为每个调用切换顶点缓冲区。如果您需要逼真的材质,您可能需要为每种材质设置不同的着色器,这意味着您必须将模型拆分为单独的绘制调用。
不确定人们是否真的这样做,但我想尝试的一种方法是使用纹理数组,其中每种材质的纹理存储为一层。使材质索引成为顶点属性,将其从顶点着色器传递到片段着色器,然后在对纹理数组进行采样时使用is作为图层。