在使用threeJS的过程中,一开始总会遇到一些问题,比如加载obj/gltf等带材质的模型时,总会出现显示效果较暗的问题。网上找到的一些解决方案其实不难发现,网上搜索了很多解决方案,但是大部分都不能从根本上解决问题。之前看到一篇文章说解决gltf的方法是在gltf中加入自发光。相关设置如下:object.traverse((child)=>{if(child.isMesh){child.material.emissiveMap=child.material.map;}})效果对比我没有找到解决办法,我找到了使用这个方法,就像在我写的vue-3d-loader组件中一样,在之前的代码中使用了这个方法,我们可以看看使用后的效果:上面代码没有使用时的gltf效果如下:windows11打开3d查看器后的效果如下:这个对比,差距真的很大。下面是添加child.material.emissiveMap=child.material.map;后的效果code:这样虽然光线看起来充足,但是确实丢失了细节,光线太严重后图像失真。对比了官方代码,查看了官方文档,当然少不了githubissue搜索,终于找到了解决方案。根据官方文档的WebGLRenderer部分,文档中提到outputEncoding的默认值为LinearEncoding。根据官方提供的示例中的代码,也看到部分加载素材后的模型对这个值进行了修改,如下:所以我确定,解决办法就是将LinearEncoding换成sRGBEncoding即可。修改代码后可以直接看到效果如下:可以自己添加一些灯光效果,可以实现windows的3D查看器效果。总结threeJS默认会使用线性编码(LinearEncoding)来渲染材质,因此会丢失真实的颜色,需要使用RGB模式编码(sRGBEncoding)来渲染材质。使用threeJS总会遇到各种各样的问题,但我的建议是多看看官方的示例代码,你会找到更多的解决办法。如果不自己封装threeJS,可以使用我写的vue-3d-loader。如果好用记得帮我入手哦!记得给我下手!如有问题,欢迎提issue,我会及时解决bug
