Three.js 缓冲区上的灯光不正确

Three.js 缓冲区上的灯光不正确,three.js,Three.js,我得到了一个使用Meshlambert材质和顶点颜色的缓冲几何体。当我如下面的gif所示应用灯光时,当BufferGeometry由具有相同颜色的不同大小的面组成时,灯光会失真。如果我用不同的颜色为每个较小的面(1x1)的灯光看起来不错。我试图计算面法线,但这并不能解决问题 我错过了什么 您使用的是顶点照明,而可能需要逐像素照明 据我所知,three.js几乎只关注PBR照明/着色器。有了这种心态,我甚至不知道兰伯特应该做什么。无论哪种方式,Lambert都只支持逐顶点照明,而不支持逐像素照

我得到了一个使用Meshlambert材质和顶点颜色的缓冲几何体。当我如下面的gif所示应用灯光时,当BufferGeometry由具有相同颜色的不同大小的面组成时,灯光会失真。如果我用不同的颜色为每个较小的面(1x1)的灯光看起来不错。我试图计算面法线,但这并不能解决问题

我错过了什么


您使用的是顶点照明,而可能需要逐像素照明

据我所知,three.js几乎只关注PBR照明/着色器。有了这种心态,我甚至不知道兰伯特应该做什么。无论哪种方式,Lambert都只支持逐顶点照明,而不支持逐像素照明,因此您将始终从针对不同拓扑的插值中获得这些瑕疵。没有任何限制可以阻止它以不同的方式工作,这只是出于设计

另一方面,
MeshPhongMaterial
会进行逐像素照明,但由于所有物理正确性,您可能很难删除镜面反射项,只留下lambert

如果你选择这样做,你可能会发现自己不得不这样做

var myBlackTexture = obtainTextureThatIsBlack()
var myMaterial = new THREE.MeshPhongMaterial({... specularMap: myBlackTexture})

总结:

我错过了什么


您忽略了任意的三个设计注意事项:)为什么这种材质按原样存在,以及为什么它不只是有一个在顶点/碎片照明之间翻转的标志,这仍然是一个疑问。

使用PhongMaterial效果非常好。我在想我在使用BufferGeometry时遗漏了一些东西,我甚至没有考虑实际使用的材料。非常感谢你的回答!