我得到了一個使用MeshLambertMaterial和VertexColors的BufferGeometry。當我按照下面的gif應用燈光時,當BufferGeometry由具有相同顏色的不同大小的面組成時,燈光會變形。如果我爲每張面部較小的臉部(1x1)使用不同的顏色,則燈光看起來不錯。我試圖計算faceNormals,但這並不能解決問題。BufferGeometry上的指示燈不正確
任何我想念的東西?
Here is a gif showing the issue
我得到了一個使用MeshLambertMaterial和VertexColors的BufferGeometry。當我按照下面的gif應用燈光時,當BufferGeometry由具有相同顏色的不同大小的面組成時,燈光會變形。如果我爲每張面部較小的臉部(1x1)使用不同的顏色,則燈光看起來不錯。我試圖計算faceNormals,但這並不能解決問題。BufferGeometry上的指示燈不正確
任何我想念的東西?
Here is a gif showing the issue
您正在使用頂點光照,而不是你可能每像素光照希望。
https://en.wikipedia.org/wiki/Per-pixel_lighting
http://www.learnopengles.com/tag/per-vertex-lighting/
這是我的理解是three.js所幾乎完全集中在PBR照明/着色器。有了這個心態,我甚至不知道蘭伯特應該用什麼。無論哪種方式,蘭伯特只支持每個頂點光照,而不是每個像素,所以你總是會得到這些工件插補針對不同的拓撲。沒有任何限制可以防止這種情況發生變化,這只是設計而已。
MeshPhongMaterial
另一方面做每個像素的照明,但由於所有的物理正確性,你可能很難去除鏡面術語,只留下lambert。
如果你選擇這個,你可能會發現自己不得不做這樣的事情
var myBlackTexture = obtainTextureThatIsBlack()
var myMaterial = new THREE.MeshPhongMaterial({... specularMap: myBlackTexture})
https://github.com/mrdoob/three.js/issues/10808
摘要:
什麼我錯過?
你錯過了任意三個設計注意事項:)爲什麼這種材料就是存在這仍將是一個謎,爲什麼它不只是一個標誌頂點/片斷照明之間翻轉。
這使用PhongMaterial真的很好。我一直在想,在使用BufferGeometry時我錯過了一些東西,而我甚至沒有考慮過使用的實際材料。非常感謝您的回答! – nergal