是否可以指定哪组UV应该用于不同的地图(纹理)?
您可以指定每个纹理应使用哪些UV吗?
答案 0 :(得分:3)
在当前版本的three.js(r78)中,没有用于为标准材料指定UV通道的界面。 Lambert / Phong /标准材料使用第二个通道(uv2)进行lightMap和aoMap。然而,可以使用标准材料制作自定义uv通道的材料。
这种材料可以这样构造:
制作顶点和片段着色器。使用块(c样式预处理器 #include 指令)构建标准的three.js材料,这些指令可以替换为您的代码。例如,在three.js standard shaders中有MeshPhongMaterial vertex和fragment着色器。片段着色器有这样的行:#include <lights_template>
。可以在lights_template.glsl中找到相应的文件chunks directory。该文件包含以下代码:
#ifdef USE_LIGHTMAP
vec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
// more code here
#endif
更改此纹理查找中的vUv2
会影响将用于lightMap的coords。如果你需要额外的紫外线设置,你可以通过顶点着色器将它们作为变化传递,就像vUv和vUv2一样。
这种方式可以通过将原始的three.js着色器复制粘贴到源代码中并进行一些编辑来获得所需的着色器。
让你制服对象。对于此THREE.UniformsLib可能会有所帮助。您也可以通过THREE.UniformsUtils.clone()从现有材料中获得统一。
在顶点和片段着色器前面添加材料所需的定义(fragmentShader = '#define USE_LIGHTMAP\n' + fragmentShader;
)。
使用THREE.RawShaderMaterial创建素材。没有预先定义的THREE.ShaderMaterial也应该有效。
此外,如果您需要简单的材料,可以更快地忽略块并从头开始编写所需的着色器。