我有一个使用MeshLambertMaterial和VertexColors的BufferGeometry。当我按照下面的gif所示应用灯光时,当BufferGeometry由具有相同颜色的不同尺寸的面组成时,灯光会变形。如果我为每个面部使用不同的颜色(1x1),那么灯光看起来很好。我试图计算faceNormals,但这并没有解决问题。
我想念的一切?
答案 0 :(得分:1)
您正在使用顶点光照,而您可能需要每像素光照。
https://en.wikipedia.org/wiki/Per-pixel_lighting
http://www.learnopengles.com/tag/per-vertex-lighting/
据我所知,three.js几乎专注于PBR照明/着色器。有了这种心态,我甚至不确定兰伯特应该用什么。无论哪种方式,Lambert仅支持每个顶点光照,而不是每个像素,因此您将始终通过针对不同拓扑进行插值来获得这些工件。没有任何限制可以阻止这种工作的不同,只是设计上的。
另一方面, MeshPhongMaterial
执行逐像素照明,但由于所有物理正确性,您可能很难删除镜面术语,只留下朗伯。
如果你选择这个,你可能会发现自己不得不做这样的事情
var myBlackTexture = obtainTextureThatIsBlack()
var myMaterial = new THREE.MeshPhongMaterial({... specularMap: myBlackTexture})
https://github.com/mrdoob/three.js/issues/10808
要点:
我想念的一切?
你错过了任意三个设计警告:)为什么这种材料按原样存在仍然是个谜,为什么它不只是在顶点/碎片光照之间翻转的标志。