Three.js 缓冲区上的灯光不正确
我得到了一个使用Meshlambert材质和顶点颜色的缓冲几何体。当我如下面的gif所示应用灯光时,当BufferGeometry由具有相同颜色的不同大小的面组成时,灯光会失真。如果我用不同的颜色为每个较小的面(1x1)的灯光看起来不错。我试图计算面法线,但这并不能解决问题 我错过了什么Three.js 缓冲区上的灯光不正确,three.js,Three.js,我得到了一个使用Meshlambert材质和顶点颜色的缓冲几何体。当我如下面的gif所示应用灯光时,当BufferGeometry由具有相同颜色的不同大小的面组成时,灯光会失真。如果我用不同的颜色为每个较小的面(1x1)的灯光看起来不错。我试图计算面法线,但这并不能解决问题 我错过了什么 您使用的是顶点照明,而可能需要逐像素照明 据我所知,three.js几乎只关注PBR照明/着色器。有了这种心态,我甚至不知道兰伯特应该做什么。无论哪种方式,Lambert都只支持逐顶点照明,而不支持逐像素照
您使用的是顶点照明,而可能需要逐像素照明 据我所知,three.js几乎只关注PBR照明/着色器。有了这种心态,我甚至不知道兰伯特应该做什么。无论哪种方式,Lambert都只支持逐顶点照明,而不支持逐像素照明,因此您将始终从针对不同拓扑的插值中获得这些瑕疵。没有任何限制可以阻止它以不同的方式工作,这只是出于设计 另一方面,
MeshPhongMaterial
会进行逐像素照明,但由于所有物理正确性,您可能很难删除镜面反射项,只留下lambert
如果你选择这样做,你可能会发现自己不得不这样做
var myBlackTexture = obtainTextureThatIsBlack()
var myMaterial = new THREE.MeshPhongMaterial({... specularMap: myBlackTexture})
总结:
我错过了什么
您忽略了任意的三个设计注意事项:)为什么这种材质按原样存在,以及为什么它不只是有一个在顶点/碎片照明之间翻转的标志,这仍然是一个疑问。使用PhongMaterial效果非常好。我在想我在使用BufferGeometry时遗漏了一些东西,我甚至没有考虑实际使用的材料。非常感谢你的回答!