如何在Three.js

时间:2016-07-03 03:52:08

标签: three.js

是否可以指定哪组UV应该用于不同的地图(纹理)?

您可以指定每个纹理应使用哪些UV吗?

1 个答案:

答案 0 :(得分:3)

在当前版本的three.js(r78)中,没有用于为标准材料指定UV通道的界面。 Lambert / Phong /标准材料使用第二个通道(uv2)进行lightMap和aoMap。然而,可以使用标准材料制作自定义uv通道的材料。

这种材料可以这样构造:

  1. 制作顶点和片段着色器。使用块(c样式预处理器 #include 指令)构建标准的three.js材料,这些指令可以替换为您的代码。例如,在three.js standard shaders中有MeshPhongMaterial vertexfragment着色器。片段着色器有这样的行:#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着色器复制粘贴到源代码中并进行一些编辑来获得所需的着色器。

  2. 让你制服对象。对于此THREE.UniformsLib可能会有所帮助。您也可以通过THREE.UniformsUtils.clone()从现有材料中获得统一。

  3. 在顶点和片段着色器前面添加材料所需的定义(fragmentShader = '#define USE_LIGHTMAP\n' + fragmentShader;)。

  4. 使用THREE.RawShaderMaterial创建素材。没有预先定义的THREE.ShaderMaterial也应该有效。

  5. 此外,如果您需要简单的材料,可以更快地忽略块并从头开始编写所需的着色器。

相关问题