Three.js凹凸貼圖bumpMap和法線貼圖.normalMap

凹凸貼圖bumpMap和法線貼圖.normalMap

本文是Three.js電子書的8.6節

一個複雜的曲面模型,往往模型頂點數量比較多,模型文件比較大,爲了降低模型文件大小,法線貼圖.normalMap算法自然就產生了,複雜的三維模型3D美術可以通過減面操作把精模簡化爲簡模,然後把精模表面的複雜幾何信息映射到法線貼圖.normalMap上。

凹凸貼圖、法線貼圖法線貼圖凹凸貼圖材質對象法線貼圖通過RGB三個分量分別表示法向量的xyz三個方向通過圖片保留幾何體表面的幾何細節繪製精模、簡模通過精模烘培出法線貼圖導出簡模和法線貼圖3D美術解析導出的模型和法線貼圖程序員協作低模+法線貼圖=高模降低模型大小,減少頂點的計算3D美術烘培使用精模導出給程序員使用簡模節約頂點數量好處圖片像素的灰度值表示幾何表面的高低深度如果定義了法線貼圖,則將忽略該貼圖沒有凹凸、法線貼圖屬性MeshLambertMaterial、MeshBasicMaterialmap屬性顏色紋理貼圖.bumpMap : Texture表示深淺程度,默認值1.bumpScale : Float凹凸貼圖.normalMap : Texture表示深淺程度 默認值是Vector2設置爲(1,1).normalScale : Vector2法線貼圖屬性MeshPhongMaterial

法線貼圖

下面代碼在沒有設置法線貼圖之前就是一個立方體網格模型Mesh,然後把一個攜帶圓形凹坑信息的法線貼圖3_256.jpg設置到立方體網格模型的面上,你可以看到面上多個凹陷效果。你可以測試源碼案例中法線貼圖目錄下的其它法線貼圖文件,查看渲染效果。

法線貼圖3_256.jpg
在這裏插入圖片描述

立方體設置法線貼圖後的效果
在這裏插入圖片描述

// TextureLoader創建一個紋理加載器對象,可以加載圖片作爲幾何體紋理
var textureLoader = new THREE.TextureLoader();
// 加載法線貼圖
var textureNormal = textureLoader.load('./法線貼圖/3_256.jpg');
var material = new THREE.MeshPhongMaterial({
  color: 0xff0000,
  normalMap: textureNormal, //法線貼圖
  //設置深淺程度,默認值(1,1)。
  normalScale: new THREE.Vector2(3, 3),
}); //材質對象Material
var mesh = new THREE.Mesh(geometry, material); //網格模型對象Mesh

法線貼圖:地球案例

地球表面法線貼圖記錄了地面表面的幾何信息。
在這裏插入圖片描述
你可以對比兩個地球的渲染效果,一個設置法線貼圖,一個不設置法線貼圖。

在這裏插入圖片描述

var geometry = new THREE.SphereGeometry(100, 25, 25); //球體
// TextureLoader創建一個紋理加載器對象,可以加載圖片作爲幾何體紋理
var textureLoader = new THREE.TextureLoader();
// 加載紋理貼圖
var texture = textureLoader.load('./Earth.png');
// 加載法線貼圖
var textureNormal = textureLoader.load('./EarthNormal.png');
var material = new THREE.MeshPhongMaterial({
  map: texture, // 普通顏色紋理貼圖
  normalMap: textureNormal, //法線貼圖
  //設置深淺程度,默認值(1,1)。
  normalScale: new THREE.Vector2(1.2, 1.2),
}); //材質對象Material

凹凸貼圖

凹凸貼圖和法線貼圖功能相似,知識沒有發現貼圖表達的幾何體表面信息更豐富。凹凸貼圖是用圖片像素的灰度值表示幾何表面的高低深度,如果模型定義了法線貼圖,就沒有必要在使用凹凸貼圖。

你可以對比兩面牆一個使用凹凸貼圖一個不使用凹凸貼圖的視覺效果。

在這裏插入圖片描述在這裏插入圖片描述

var textureLoader = new THREE.TextureLoader();
// 加載顏色紋理貼圖
var texture = textureLoader.load('./凹凸貼圖/diffuse.jpg');
// 加載凹凸貼圖
var textureBump = textureLoader.load('./凹凸貼圖/bump.jpg');
var material = new THREE.MeshPhongMaterial({
  map: texture,// 普通紋理貼圖
  bumpMap:textureBump,//凹凸貼圖
  bumpScale:3,//設置凹凸高度,默認值1。
}); //材質對象Material
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章