Model 如何告诉frag shader在外部生成的3D文件的每个顶点上使用哪个纹理(许多以前加载的纹理)?

Model 如何告诉frag shader在外部生成的3D文件的每个顶点上使用哪个纹理(许多以前加载的纹理)?,model,textures,webgl,blender,Model,Textures,Webgl,Blender,我正试图找出将纹理3D模型加载到我的webGL应用程序中的最佳方法,但遇到了一些问题。我的3D模型有不止一个纹理,我不知道如何告诉着色器每个顶点使用哪个纹理,因为到目前为止我查看的3D文件中似乎没有包含这些信息。 我将举一个例子:我在搅拌机中模拟了一把带皮革座椅/座垫的木椅。我应该导出哪种格式的椅子,以便轻松高效地提取: -垂直位置; -定义每个面所属顶点的面/索引信息。 -紫外线坐标; -常态 -纹理文件的名称/位置。 -每个顶点使用哪个纹理 我假设一旦我的JS中有了顶点纹理ID对,我就可以将

我正试图找出将纹理3D模型加载到我的webGL应用程序中的最佳方法,但遇到了一些问题。我的3D模型有不止一个纹理,我不知道如何告诉着色器每个顶点使用哪个纹理,因为到目前为止我查看的3D文件中似乎没有包含这些信息。 我将举一个例子:我在搅拌机中模拟了一把带皮革座椅/座垫的木椅。我应该导出哪种格式的椅子,以便轻松高效地提取: -垂直位置; -定义每个面所属顶点的面/索引信息。 -紫外线坐标; -常态 -纹理文件的名称/位置。 -每个顶点使用哪个纹理

我假设一旦我的JS中有了顶点纹理ID对,我就可以将它作为属性(基于每个顶点)传递给着色器,让它知道要为特定顶点使用哪个纹理(使用抽屉元素一次绘制所有顶点),但我不知道如何从一开始就获得这些信息

到目前为止,我在网上找到的所有文章、指南和教程都只加载了一种纹理的模型。我还注意到three.js似乎已经解决了这个问题,但我有点想在进入其中一个库(如three.js、glge、scene.sj、spiderGL等)之前让它直接在webGL上工作


任何帮助、链接或建议都将不胜感激。

听起来您这里有两个问题,一个我们可以帮助解决,另一个需要更多信息

首先,大多数情况下,不会按顶点列出纹理信息,因为按面列出纹理信息更自然。您仍然需要将其传递给逐顶点着色器,因此您可能需要进行一些预处理,但这应该不会太糟糕。如何从文件中获取这些信息完全取决于所使用的格式,但您尚未指定

对于使用一个文件渲染多个纹理,有两种方法。可以将所有需要的纹理绑定到着色器中的采样器阵列,然后使用顶点属性对其进行索引,这是您之前暗示的。这是减少draw调用数量的一个好方法,但这有点极端优化,我怀疑您是否会从中受益匪浅


更常见的做法是对每种材质进行一次绘制调用(在您的示例中,材质==纹理)。因此,如果您有一张带有木制框架和皮革座垫的椅子,如您所述,您将绑定木材纹理,渲染整个框架,然后绑定座垫纹理并单独渲染座垫。这使您有机会进一步为每种材质类型使用不同的着色器,因此您可以提高皮革零件的镜面反射度,同时保持木材美观且无光泽。对每个对象进行几次绘制调用听起来可能很昂贵,但在大多数情况下,这并不是一个大问题,除非您处理的是一些非常复杂的场景。

感谢Toji的回复(非常整洁的博客-tojicode-您已经有了,顺便说一句)。因此,我假设我必须将帧存储在某个地方(可能是帧缓冲区),以便执行您的第二个建议(每帧渲染一个纹理)。。。听起来不错,我会调查的。再次感谢。关于3D格式:我还没有正式选择要使用的3D格式。我尝试过使用collada、JSON和3ds,但仍然不确定哪一个最适合我。我倾向于JSON bc,它很容易解析。我发现一些例子引用了JSON中的二进制文件来缩短其大小,我目前正在研究这个概念。对不起,我需要澄清一点:我不是说每帧一个纹理(这将非常困难和缓慢)。我的意思是每画一个纹理。draw调用基本上是在您调用gl.DrawArray/gl.drawElements的任何时候进行的。感谢您的澄清,Toji。