我正在尝试将
THREE.MeshLambertMaterial
应用于 Autodesk Forge Viewer 中的模型。 viewer3D.js 版本为 7.87.0。一旦我调用fragList.setMaterial(fragId, lambertMaterial)
,模型就会消失,并出现以下控制台警告:
GL_INVALID_OPERATION: Active draw buffers with missing fragment shader outputs.
使用
THREE.MeshBasicMaterial
没有错误,但我想利用 Lambert 材质的着色能力。理想情况下,我会使用 THREE.MeshPhongMaterial
,但 Forge Viewer 似乎使用了 THREE.MeshPhongMaterial
的修改版本,因此通常适用于 Phong 的效果不再有效(例如,material.envMap
的行为与使用正常的三种材料,以及影响 envMap 混合的material.combine
属性无法更改)。
我已经创建了一个 Github 存储库和测试页面来演示这个问题。
存储库:https://github.com/throw-away-97743/ForgeViewerTests
现场演示:https://throw-away-97743.github.io/ForgeViewerTests/basic-lambert-test.html
相关JavaScript代码:
// please refer to the live demo and repository
// for a more interactive example
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);
您可以通过这篇博文信息消除菲涅尔效应:
https://aps.autodesk.com/blog/fix-material-reflections-forge-viewer
..并从设置中选择平坦的 IBL 照明环境。
需要加点射灯还是定向灯?
您想要的“外观”是什么?