1. 程式人生 > >【Babylonjs】材質

【Babylonjs】材質

    使用材質可以使你能夠覆蓋物體網格的顏色和紋理,它們需要在被光線照射下才能被看到。一種材質可以用來覆蓋你所希望改變的物體的網格。

對光線的反應

    不管材質是顏色還是質地,它對光的反應都有不同的方式。

  1. 漫反射(Diffuse)—— 在光線下觀察的材料的基本顏色或質地;

  2. 鏡面,也叫高光(Specular)—— 光線給材質的亮點;

  3. 發光(Emissive)—— 發光材料的顏色或質地,如自發光;

  4. 環境(Ambient)—— 由環境背景光照明的材料的顏色或質地。

    漫反射和鏡面材料需要建立光源。
    環境顏色需要設定場景的環境顏色,提供環境背景照明。

scene.ambientColor = new BABYLON.Color3(1, 1, 1);

透明度(Transparency)—— 你可以通過該材料看到部分透明的影象,它可以使材料的適當部分是看不見的。這需要設定一個alpha屬性。 

顏色(Color)

    首先建立一個可使用的材質。

var myMaterial = new BABYLON.StandardMaterial("myMaterial", scene);

    使用diffuseColor、specularColor、emissiveColor和ambientColor屬性中的一個或幾個設定材質的顏色。其中,ambientColor只有在場景的環境光已經被設定了以後才會生效。

var myMaterial = new BABYLON.StandardMaterial("myMaterial", scene);

myMaterial.diffuseColor = new BABYLON.Color3(1, 0, 1);
myMaterial.specularColor = new BABYLON.Color3(0.5, 0.6, 0.87);
myMaterial.emissiveColor = new BABYLON.Color3(1, 1, 1);
myMaterial.ambientColor = new BABYLON.Color3(0.23, 0.98, 0.53);

mesh.material = myMaterial;

漫反射顏色的例子

    給出一個概念,即物質漫射色對漫射光色的反應如下

    下列圖中材質的基本顏色從左到右,從上到下,分別為黃色、紫色、青色、白色。分別對白色、紅色、綠色和藍色漫反射燈作出反應。注意視角如何調節燈光。

Spot Light

嘗試一下

環境顏色的例子

    所有的球都被同一個diffuseColor為紅色,groundColor為綠色的HemisphereicLight照射。第一個球體沒有周圍的顏色,中間的球體有紅色的環境顏色定義在其材料上,右邊的球體是一個有綠色環境顏色的材料。必須呈現的場景環境顏色是白色。當場景的環境顏色元件設定為0,例如紅色,那麼無論材質顏色周圍的紅色值是什麼,都不會有效果。

嘗試一下


透明度顏色的例子

    通常我們通過設定物體材質alpha值來改變它的透明度,範圍是0-1之間。

var myMaterial.alpha = 0.5;

嘗試一下

紋理(Texture)

    紋理由儲存的圖片組成。

    建立一個可使用的材質。

var myMaterial = new BABYLON.StandardMaterial("myMaterial", scene);

    使用diffuseTexture、specularTexture、emissiveTexture以及ambientTexture等屬性中的一個或多個來設定一個材質的紋理。其中,ambientTexture只有在沒有設定場景環境顏色的時候才被使用。 

var myMaterial = new BABYLON.StandardMaterial("myMaterial", scene);

myMaterial.diffuseTexture = new BABYLON.Texture("PATH TO IMAGE", scene);
myMaterial.specularTexture = new BABYLON.Texture("PATH TO IMAGE", scene);
myMaterial.emissiveTexture = new BABYLON.Texture("PATH TO IMAGE", scene);
myMaterial.ambientTexture = new BABYLON.Texture("PATH TO IMAGE", scene);

mesh.material = myMaterial;

注意:當沒有指定法線時,BabylonJs的標準材料將計演算法線。

紋理的例子

    所有的球都被同一個diffuseColor為紅色,groundColor為綠色的HemisphereicLight照射。第一個球體有一個漫反射的紋理,中間是一個發光的紋理,右邊的一個有紅色的漫射顏色和一個環境紋理。

Texture

嘗試一下

透明紋理的例子

    先設定材質的透明度

var myMaterial.alpha = 0.5;

嘗試一下

此外,用於紋理影象可能已經有一個透明度設定,如這張來自維基共享資源的一隻狗,它有一個透明的背景;

A dog

    在例子中,我們需要設定紋理的hasAlpha屬性的值為true。

var myMaterial.diffuseTexture.hasAlpha = true;

嘗試一下

對於立方體的背面,通過前面的透明區域可以看到,我們必須處理背面的剔除。

背面的剔除

    這是一種有效地繪製三維模型的二維螢幕渲染的方法。通常不需要畫立方體或其他物體的背面,因為它會被前面的面遮住。在BabylonJS的預設設定為true。

    看下面的圖片,當材料的效能backfaceculling是true的時候,你可以看到,在狗的透明區域仍然是透明的,你可以通過他們看到背景。然而,你不能看到背面的影象,因為它們已經被剔除(或刪除)。當backfaceculling是false的時候,背面不在渲染過程中可以通過前面的透明區域看到去除面。

Back Face Culling TrueBack Face Culling False
BFC TrueBFC False

嘗試一下

線框(WireFrame)

    你可以看到一個線上框模式下的物體網格。

materialSphere1.wireframe = true;

wireframe