如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?

Posted

技术标签:

【中文标题】如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?【英文标题】:How to replace Collada-imported textures with ShaderMaterial ones in Three.js? 【发布时间】:2012-06-02 16:30:38 【问题描述】:

有没有办法替换通过 Three.js 库中的 Collada 加载器导入的简单 3D 模型中的所有纹理?

我想要完成的是通过 ShaderMaterial 将颜色、镜面反射和法线贴图应用到模型,方法是指向具有模型材质名称但添加了“-color”、“-normal”和“-spec”的新文件措辞:

“brochureFrontCover”->“brochureFrontCover-color.jpg”、“brochureFrontCover-normal.jpg”、“brochureFrontCover-spec.jpg”

如果哪位好心人能告诉我这样的功能应该是什么样子,我将不胜感激。

脚本: http://dev.printhouse.co.uk/uv-simulator/j/Brochure.js

科拉达型号: http://dev.printhouse.co.uk/uv-simulator/m/Brochure.dae

【问题讨论】:

【参考方案1】:

我觉得应该是这样的:

THREE.SceneUtils.traverseHierarchy( dae, function ( child ) 

    if ( child.material ) 

        var shader = THREE.ShaderUtils.lib[ "normal" ];
        var uniforms = THREE.UniformsUtils.clone( shader.uniforms );

        uniforms[ "tDiffuse" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-color.jpg" );
        uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-normal.jpg" );
        uniforms[ "tSpecular" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-spec.jpg" );

        uniforms[ "enableDiffuse" ].value = true;
        uniforms[ "enableSpecular" ].value = true;

        child.geometry.computeTangents();

        child.material = new THREE.ShaderMaterial( 
            uniforms: uniforms,
            vertexShader: shader.vertexShader,
            fragmentShader: shader.fragmentShader,
            lights: true
         );

    

 );

如果您需要调整制服,This example 应该是一个很好的参考。

【讨论】:

谢谢mrdoob!我已经更新了脚本并且收到了GL_INVALID_OPERATION : glDrawXXX: attempt to access out of range vertices 错误。 dae 参数是否应该调用模型层次结构中的任何特定级别(我将其设置为 dae = collada.scene;)? 哦哦!好吧,从child.material = new THREE.MeshBasicMaterial( wireframe: true ); 开始,看看至少它是否有效...... 是的,这显示了一个不错的线框模型。那么,你怎么看? 如果这是库中的错误或者有其他方法可以更新我吗?非常感谢! 那么,让child.material = new THREE.MeshBasicMaterial( wireframe: true ); 工作......你什么时候开始遇到问题?

以上是关于如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 three.js 在 React Native 中运行(没有 WebView)?

使用Three.js 心得系列一 如何创建三维网格三使用Three.js 心得系列三 Three.js 如何加载GlTF文件

如何使用three.js在运行时绘制线段

如何在three.js 上覆盖HTML 文本/按钮?

如何从 THREE.js 示例中导入代码?

如何在three.js中导入json和渲染