[SceneKit專題]10-Materials材質

蘋果API搬運工發表於2017-12-25

說明

本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會

此書對應的程式碼地址

SceneKit系列文章目錄

最終的實時渲染效果圖

QQ20170409-001805@2x.png

Lighting models(照明模型)

WX20171203-141252@2x.png

  • Constant:使用一個扁平的照明模型,在計算渲染畫素的顏色時,只包含ambient資訊.
  • Lambert:在計算渲染畫素的顏色時,只包含ambient資訊和diffuse資訊.
  • Blinn:在計算渲染畫素的顏色時,只包含ambient資訊,diffuse資訊,specular資訊,而且specular高光區是用Blinn-Phong法則計算的.
  • Phong:在計算渲染畫素的顏色時,只包含ambient資訊,diffuse資訊,specular資訊,而且specular高光區是用Phong法則計算的.
  • PBR:即Physically Based Rendering基於物理的渲染,包含了真實情況下,物理光源和材質對光的漫反射和吸收.

Materials(材質)

一般也就是textures(紋理). 紋理實際是2D圖片按照幾何體內部的紋理座標系展開,包裹在3D幾何體表面.所有Scene Kit內部自帶的初始形狀已經包含了這個座標資訊.

  • Diffuse map(顏色貼圖,漫反射貼圖):給幾何體一個基本的顏色紋理,不考慮燈光和特效:

    QQ20170409-111646@2x.png

  • Normal map(法線貼圖):在上篇文章的燈光裡講過,燈光是使用形狀表面的法向量來決定照亮哪個面的.系統自帶形狀是使用單一的整個面的向量,而法線貼圖則以RGB值定義了精確到每個畫素的法向量,這樣每個畫素對燈光的反應都不同,形成表面崎嶇不平的燈光效果.

    QQ20170409-111705@2x.png
    QQ20170409-111814@2x.png

  • Reflective map(反射貼圖):以黑白圖片精確定義了材質每個畫素的反光程度.就是周圍環境的光線在物體表面對映出的影像(實際就是天空盒子影像在物體表面的反光).

    QQ20170409-111848@2x.png
    QQ20170409-111903@2x.png

需要注意的是 Xcode8之前,反射貼圖和前面兩個貼法不同,不是直接拉伸包裹在幾何體上面的,而是用cube mapping(立方體貼圖)來完成的.想像一個立方體,六個面的紋理並排水平放置,就形成了立方體貼圖:

WX20171203-141904@2x.png

QQ20170409-114742@2x.png

Xcode8之後別的形式立方貼圖也可以,:

WX20171203-141954@2x.png

Xcode8還支援了1:2的球面貼圖:

WX20171203-142110@2x.png

  • Occlusion map(閉塞貼圖):也就是ambient occlusion map(AO貼圖,環境光閉塞貼圖),只有當場景中有ambient light環境光時才有作用,精確定義了每個畫素在環境光作用下的被照亮程度.也就是讓幾何體的黑色部分不被環境光照亮而變淺.

QQ20170409-111917@2x.png

QQ20170409-111930@2x.png

  • Specular map(鏡面貼圖,高光貼圖):鏡面貼圖決定了幾何體的鏡面程度,黑色部分就是不光滑,白色就是光滑反光.會影響Normal map(法線貼圖)外部光線照射反光和Reflective map(反射貼圖)外部天空盒子影像反光的清晰程度

    QQ20170409-111949@2x.png
    QQ20170409-112002@2x.png

  • Emission map(發光貼圖):在沒有光線時,如果物體表面有熒光塗料,就會發光.發光貼圖可以用來模擬這種物體.彩色貼圖中,黑色不發光,亮色發光強,暗色發光弱.

    QQ20170409-112012@2x.png
    QQ20170409-112024@2x.png
    需要注意的是 在Scene Kit中Emission map(發光貼圖)並不真正發光,只是模擬發光效果而已.就是說不能照亮其他物體,不能產生陰影.這點與其他3D創作工具不同.

  • Multiply map(乘法貼圖,正片疊底貼圖):會影響其他所有效果.一般用來給最後的效果調整色彩或者亮度.

    QQ20170409-120113@2x.png

QQ20170409-120125@2x.png

  • Transparency map(透明貼圖):黑色部分不透明,白色透明. 注意:球體內部需要開啟double-sided mode才能看到
    QQ20170409-120138@2x.png

QQ20170409-120149@2x.png

  • Metalness and Roughness maps(光澤度和粗糙度貼圖):Xcode8引入的新特性,Physically Based Rendering (PBR)燈光模型可以使用MetalnessRoughness貼圖.
    WX20171203-142500@2x.png

QQ20170409-143922@2x.png

skybox天空盒子

設定方法如圖,也可以用程式碼設定:

QQ20170409-140020@2x.png

let scene = SCNScene()
scnView.scene = scene
scene.background.contents = "skybox01_cube.png"
複製程式碼

當使用Cube map立方體貼圖時,Scene Kit支援以下幾種影像模式

1. A horizontal strip image  where `6 * image.height ==     image.width`水平排列寬高6:1
2. A vertical strip image    where `    image.height == 6 * image.width`豎直排列寬高1:6
3. A horizontal cross image  where `4 * image.height == 3 * image.width`水平十字交叉寬高3:4
4. A vertical cross image    where `3 * image.height == 4 * image.width`豎直十字交叉寬高3:4
5. A lat/long image          where `    image.height == 2 * image.width`經緯度圖片寬高1:2
6. A NSArray of 6 images. This array must contain images of the exact same dimensions, in the following order, in a left-handed coordinate system: +X, -X, +Y, -Y, +Z, -Z (or Right, Left, Top, Bottom, Front, Back).圖片陣列6複製程式碼

QQ20170409-141542@2x.png

QQ20170409-140951@2x.png

相關文章