C++ 使用多个纹理将纹理指定给对象

C++ 使用多个纹理将纹理指定给对象,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,我正在制作一个对象加载器,所有的纹理部分都在不同的纹理文件中。将其映射到模型上的最佳解决方案是什么? 我是否需要将每个具有自己纹理的零件视为一个模型,以便最终实体具有多个单独的绘图调用,每个调用一个纹理?随着可编程渲染管道(即:着色器)的出现,您现在可以将多个纹理应用并组合到网格,而无需多个绘图调用 现代GPU有多个纹理单元(glActiveTexture),着色器可以一次读取多个纹理单元。例如,您在图片中显示的右侧模型可能使用灯光模型的变体,该模型具有漫反射纹理、纹理以及可能的高光纹理。所有这

我正在制作一个对象加载器,所有的纹理部分都在不同的纹理文件中。将其映射到模型上的最佳解决方案是什么?
我是否需要将每个具有自己纹理的零件视为一个模型,以便最终实体具有多个单独的绘图调用,每个调用一个纹理?

随着可编程渲染管道(即:着色器)的出现,您现在可以将多个纹理应用并组合到网格,而无需多个绘图调用

现代GPU有多个纹理单元(
glActiveTexture
),着色器可以一次读取多个纹理单元。例如,您在图片中显示的右侧模型可能使用灯光模型的变体,该模型具有漫反射纹理、纹理以及可能的高光纹理。所有这三种纹理肯定都应用于每个纹理单元,整个模型在一次绘制调用中渲染。片段着色器然后读取该纹理并将其组合以生成最终图像


你的问题不是很具体,所以我现在只能说这些。如果您有更具体的问题,请随时提问。

为需要不同纹理(或纹理集,如果您需要像@glampert建议的法线贴图这样的东西)的每个部分分别进行绘制调用是一种可能性。您似乎有相当复杂的几何体,所以这可能不会非常低效,因为您的绘制调用仍然相当大。您仍然可以将模型的所有顶点/索引都放在一个缓冲区中,这样至少不必为每个调用切换顶点缓冲区。如果需要真实材质,可能需要为每个材质使用不同的着色器,这意味着您必须将模型拆分为单独的绘制调用


不确定人们是否真的这样做了,但我想尝试的一种方法是使用纹理数组,其中每个材质的纹理存储为一个层。将材质索引设置为顶点属性,将其从顶点着色器传递到片段着色器,然后在对纹理阵列进行采样时使用is作为层。

我正在寻找一个教程/代码,介绍如何在从obj文件中读入此内容后继续操作。。。比如,为了在正确的时间使用正确的纹理,我必须在什么点放入什么缓冲区等。我有一个数据类存储我的所有数据。。。顶点、颜色、法线、纹理、纹理、纹理、纹理、纹理、材质。从那里我完全不知道该做什么…我可以告诉你,非常完整的网站和良好的介绍。还有一个额外的来源。