Autodesk Forge Viewer中THREE.MeshLambertMaterial失效问题求助
Forge Viewer中应用标准Three.js MeshLambertMaterial的问题
在Autodesk Forge Viewer(viewer3D.js 7.87.0版本)中尝试为模型应用THREE.MeshLambertMaterial,调用fragList.setMaterial(fragId, lambertMaterial)后模型直接消失,控制台抛出警告:
GL_INVALID_OPERATION: Active draw buffers with missing fragment shader outputs.
使用THREE.MeshBasicMaterial可以正常运行,但需要利用Lambert材质的着色能力。原本想使用THREE.MeshPhongMaterial,但Forge Viewer对该材质做了修改,导致标准Three.js的功能无法正常工作——比如material.envMap表现异常,控制环境贴图混合的material.combine属性无法修改。
相关代码示例:
const fragList = model.getFragmentList(); const matMan = Viewer.impl.matman(); const fragIds = Object.keys(fragList.fragments.fragId2dbId); const lambertMaterial = new THREE.MeshLambertMaterial(); lambertMaterial.color = new THREE.Color(0xff0000); matMan.addNonHDRMaterial("lambertMaterial", lambertMaterial); lambertMaterial.envMap = null; lambertMaterial.needsUpdate = true; fragIds.forEach(fragId => fragList.setMaterial(fragId, lambertMaterial)); Viewer.impl.invalidate(true);
2023-04-20 需求说明
需要材质完全复刻Three.js文档中MeshLambertMaterial的表现,至少满足以下要求:
- 可设置环境贴图(envmap),且贴图完整包裹整个网格
- 材质可接收光照,但不使用IBL(基于图像的光照),可自行创建环境光或点光源
- 材质的
.combine属性需与标准Three.js MeshLambertMaterial一致 - 支持纯色设置
- 支持纹理贴图
- 支持凹凸/法线贴图
- 支持透明度贴图(alpha map)
- 支持透明度效果
简言之,就是要具备标准THREE.MeshLambertMaterial的全部功能。
补充说明图示:
Three.js文档中MeshLambertMaterial演示效果:
内容的提问来源于stack exchange,提问作者xblz
相关产品推荐
相关产品推荐

