2017-07-17 71 views
0

我得到了一個使用MeshLambertMaterial和VertexColors的BufferGeometry。當我按照下面的gif應用燈光時,當BufferGeometry由具有相同顏色的不同大小的面組成時,燈光會變形。如果我爲每張面部較小的臉部(1x1)使用不同的顏色,則燈光看起來不錯。我試圖計算faceNormals,但這並不能解決問題。BufferGeometry上的指示燈不正確

任何我想念的東西?

Here is a gif showing the issue

回答

1

您正在使用頂點光照,而不是你可能每像素光照希望。

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

摘要:

什麼我錯過?

你錯過了任意三個設計注意事項:)爲什麼這種材料就是存在這仍將是一個謎,爲什麼它不只是一個標誌頂點/片斷照明之間翻轉。

+0

這使用PhongMaterial真的很好。我一直在想,在使用BufferGeometry時我錯過了一些東西,而我甚至沒有考慮過使用的實際材料。非常感謝您的回答! – nergal