当前位置: 首页 > 知识库问答 >
问题:

使用多个纹理为对象指定纹理

毛德华
2023-03-14

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

共有2个答案

阎冠玉
2023-03-14

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

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

安泰平
2023-03-14

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

现代GPU有几个纹理单元(glActiveTexture),着色器可以一次读取可能的单元。例如,您在图片中显示的右侧模型可能使用Phong照明模型的变体,其中包含漫反射纹理、普通地图纹理和高光镜面地图纹理。所有这三种纹理肯定都应用于一个纹理单元,整个模型在一次绘制调用中呈现。然后片段着色器读取这些纹理并将它们组合以生成最终图像。

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

 类似资料:
  • 有人能给我解释一下,我如何在OpenGL中渲染多个不同纹理的物体吗? 我认为我接近最终结果,但目前我被困在这里,我不知道下一步需要做什么。真的需要一些帮助! 目前,这就是我所拥有的: > < li> drawSphere():根据经度和纬度的数量绘制UV球体 int numberOfVerices = 0; SetupGeometry():该方法用于绑定顶点和纹理坐标。 DrawSphere(30

  • 在glsl 420中,添加了功能来指定着色器中的绑定,而不必调用。例如: 但是,如何才能为阵列做到这一点呢? 我希望绑定为0,1,2,。。。,15.如果没有任何调用,我是否无法在glsl中执行此操作?

  • 我需要在着色器中使用两个纹理,一个在顶点着色器中,另一个在片段着色器中。在这两种情况下,它们都在着色器中引用,例如

  • 我正在努力发送多个纹理到一个单一的着色器,并有一个奇怪的问题,在着色器中的两个采样器似乎得到相同的纹理数据。我知道还有很多其他的多纹理问题和答案(这里有一些我已经读过很多次了1,2,3),但一些bug正在逃避我,我开始失去我的弹珠。我很有信心我已经把一切都安排好了,但显然还是有一些问题。 所以,目前我有形状,材料,纹理,和着色器类。我的shape类是执行实际绘制的父类。它有一个具有着色器和纹理数组

  • 我创建了一个类来保存我的模型信息。我必须正确渲染模型并正确包装纹理,但是由于某种原因,如果我有多个模型,它会将我所有的模型纹理化为仅1个纹理,正如您在这张图片中看到的:http://imgur.com/d0glIwF 知道为什么会这样吗? 这是我的代码: 提前谢谢你。

  • Three.js数据纹理对象DataTexture简单地说就是通过程序创建纹理贴图的每一个像素值。 程序生成一张图片的RGB值 var geometry = new THREE.PlaneGeometry(128, 128); //矩形平面 /** * 创建纹理对象的像素数据 */ var width = 32; //纹理宽度 var height = 32; //纹理高度 var size