2.5Bump Mapping 凹凸映射

一、Bump Mapping 介紹

  • 我們想要在屏幕上繪制物體的細節,從尺度上講,一個物體的細節分為:宏觀、中觀、微觀
  • 宏觀尺度中其特征會覆蓋多個像素,中觀尺度只覆蓋幾個像素,微觀尺度的特征就會小于一個像素
  • 宏觀尺度是由頂點或三角形或其他幾何圖元來表示,我們創建三維角色是,其四肢頭部等通常在宏觀尺度下建模
  • 微觀尺度工作在著色模型中,著色模型通常在像素著色模型里實現,并使用紋理貼圖作為參數,著色模型模擬了物體表面微觀幾何形狀的相互作用,如:有光澤的物體在微觀尺度下是光滑的,而漫反射的物體在微觀尺度下是粗糙的,角色的皮膚或衣服看起來材質不同,因為他們使用了不同的著色模型或著色模型參數不同
  • 而中觀尺度則表述了宏觀與微觀之間的特征,它包含的細節比較復雜,無法用單個三角形來渲染,但這些細節又足夠大,讓觀察者能看出幾個像素以上的表面曲率變化,比如人臉上的皺紋,肌肉組織的細節,衣服的褶皺或者磚頭之間的縫隙等等,這些都屬于中觀尺度的特征
  • 凹凸映射就是模擬中觀尺度的常用方法之一,它能夠讓觀察者觀察到比幾何模型的尺度更小的細節,其基本思想在紋理中把尺度細節相關信息給編碼進去,在著色過程中用稍微受到干擾的表面代替真實表面,就得讓表面具有小尺度的細節

1.關于Bump Mapping

  • 凹凸貼圖映射技術是對物體表面貼圖進行變化然后再進行光照計算的一種技術。
  • 例如給法線分量添加噪音,或者在一個保存擾動值的紋理圖中進行查找。
  • 這是一種提升物體真實感的有效方法,但卻不需要額外的提升物體的幾何復雜度。
  • 這種方式在提升物體的表面細節或者表面的不規則性方面有顯著效果。

2.Bump Mapping分類

  • Bump Mapping的種類主要有:法線映射、視差映射、浮雕映射。這幾種方法或者貼圖。
  • 都是廣泛的被使用,來增加模型的細節效果,或者用來做特殊的畫面表現效果。
  • 最常用的是法線映射,一般的增加法線貼圖后,會對局部的物體表面進行法線擾動,進而改變明暗關系,從而達到增加表面細節的效果。
  • 其中三種映射中都用到的法線貼圖也是本次介紹的重點內容。

二、Normal Mapping 法線映射

1.關于Normal Mapping

  • Normal Map 是一張存有物體局部表面法線信息的一張貼圖。
  • 在計算光照的時候,程序會去讀取法線圖,并獲取到當前像素點的法線信息,結合光線信息進行光照計算。
  • 使用法線貼圖計算光照,可以讓物體表現出更加豐富的細節,并隨著光照方向的變換實時變化。這是普通紋理貼圖不能表現出的。
  • 法線貼圖一般由高模映射到對應的底模上來生成。但像金屬,木頭等這些細節豐富的物體,可借助程序化的軟件如:Photo Shop,Substance Designer等生成對應法線貼圖。

2.法線映射的實現

切線空間

  • 法線的存儲,一般會放到模型的切線空間中。
  • 切線空間是以物體表面的切線,副切線和法線組成的幾何空間(如下圖)。
  • 當我們計算光照時,需要把光照運算的向量放到統一坐標系下。讀取切線空間法線,需要世界坐標轉切線空間的轉換矩陣 或 切線空間轉世界空間的轉換矩陣,將向量統一到同一坐標系后再進行光照操作。

世界和切線空間轉換

  • 將世界坐標系下的頂點法線(Normal)和切線(Tangent)以及副切線(Bitangent)作為切線空間坐標系的正交基。并用這三個向量的標準正交基來構建轉換矩陣。
  • 對應關系為法線作為Z軸,切線作為X軸,副切線作為Y軸。
  • 構建一個3*3的矩陣來做空間向量的坐標系轉換。一般的叫該矩陣為TBN矩陣。
  • 其逆矩陣就是從切線空間到世界空間的轉換矩陣記TBN-1,因為TBN為正交陣,所以其逆矩陣為TBN的轉置矩陣。
  • 矩陣構建完成后,接下來就是光照計算部分。

法線存在各個空間里都可以,但關鍵不只是存在哪里,還有后續的光照計算

切線空間的優點:

  • 自由度高。模型空間下是絕對法線信息(僅可以用在創建它時的那個模型),而切線空間下的是相對法線信息,是對當前物體法線的擾動。(可以復用)
  • 可進行uv動畫。比如:移動uv坐標來實現凹凸移動效果
  • 可以重用法線紋理。比如:一個立方體,6個面可以用一張法線貼圖
  • 可壓縮。由于切線空間下貼圖中法線的Z方向總是正方向(模型空間下可以是負的),那么我們只存XY(切線和副切線)就能推出Z(法線)了,可以少存一個。

Unity中法線貼圖的壓縮格式

  • 在unity中,非移動平臺上,Unity會把法線貼圖轉換成DXRT5nm格式。
  • 這種格式只有兩個有效通道GA通道,這樣可以節省空間,而移動平臺Unity使用傳統的RGB通道
  • 在DXRT5nm格式中,GA存儲對應法線的x、y分量,z分量需要通過一個簡單的運算求得。、

三、Parallax Mapping 視差映射

1.關于Parallax Mapping

法線映射雖然能展示較為逼真的模型表面細節,但畢竟法線映射只能改變法線進而改變光照,并不能讓模型表面產生令人信服的遮擋效果。所有我們引入視差映射

Parallax Mapping中文為視差映射,是一種類似于法線映射的技術,但原理不同,類似法線貼圖,它是用以提供模型表面細節并賦予其遮擋關系的技術,并可以和法線貼圖一起使用提供令人信服的逼真效果

  • 視差映射同樣引進一張新的貼圖,高度圖,高度圖一般是作為頂點位移來使用的,但模型要包含大量三角形才能獲得不錯的效果,否則看起來會成塊狀。
  • 所有如何在有限的三角面上表示逼真的令人信服的效果?這就是視差映射技術,視差映射的核心是改變紋理坐標,但是如何改變,怎么改變?
  • 這時就需要一張存儲模型信息的高度圖,利用模型表面高度信息來對紋理進行偏移

2.視差映射的實現

  • 視差映射主要是要讓平面看起來立體,和法線貼圖一樣是欺騙眼睛的做法。
  • 我們的模型在切線空間下,所有的點都位于切線和副切線組成的平面內(圖中0.0點),但實際上物體要有更豐富的細節。
  • 例如圖中的情況:如果不使用視差貼圖,要計算當前視角下,片元A點(黃色)的信息,就是圖中的Ha,實際使用視差貼圖時,真實的情況應該是視線和A點延長線和物體的交點,也就是B點,相應的就是Hb

視差映射的具體算法:如何在知道A的uv值的情況下,算出B的uv值。

知道AB兩者的偏移量即可

偏移量的獲得:用近似的方法去求解

  • 首先拿A的高度信息進行采樣,得到物體表面距離水平面(0.0)的深度值Ha。
  • 用深度值Ha和視線的三角關系算出物體上等比的偏移方向,算出近似的B點(可以看到圖中近似點B和實際點B還是有挺大差距的,所以模擬度比較低)

  • 得到偏移之后B點的uv,再去對法線貼圖進行采樣、計算時,就不會采樣A點了,而是B點
  • 理解:視差貼圖是如何產生遮擋效果的
  • 當視線看到的是A點這樣深度嗎 比較大的,那么視差貼圖計算出的偏移值也是非常大的,這樣A點最終被渲染出來的機會就比較小(偏移后就被采樣到其他點上了)
  • 當視線看到B點這樣深度比較小的點,計算出來的偏移就比較下,甚至原來點的附近,所以被采樣的機會就比較大
  • 深度大的點很容易被深度小的點覆蓋掉,這樣就會表現出遮擋的效果

3.陡視差映射 Steep Parallax Mapping

  • 也是近似解,但比視差映射精確

基本思想

  • 將物體表面分為若干層,從最頂端開始采樣,每次沿著視角方向偏移一定的值
  • 如果當前采樣的層數,大于實際采樣的層數,就停止采樣。

例如圖中D點,采樣到0.75層,實際是0.5層,就停止采樣,返回偏移坐標

陡視差映射的算法:(計算偏移點的過程)

  • 首先對A點采樣,得到深度大約為0.8的位置,而其對應視線深度為0.0,不符合我們的基本思想,繼續采樣
  • 采樣B點,深度為1,視線深度為0.25,不符合,繼續采樣
  • 采樣C點,深度大約為0.8,視線深度為0.5,不符合,繼續采樣
  • 采樣D點,采樣深度為0.5,視線深度約為0.75,符合上述的條件,認為是比較合理的一個偏移點,就返回結果(return)。

陡視差的問題

  • 在于分層機制,如果分層多,性能開銷就會大;分層小,渲染鋸齒就比較明顯。
  • 一種做法:可以根據視角v和法線n的角度限定采樣層數
  • 鋸齒問題會在浮雕貼圖上做改善

四、Relief Mapping 浮雕映射

1.關于Relief Mapping

  • 可以更精確的計算uv偏移量(視差如果偏移量大的話就會失真)、提供更多的深度、還可以做自陰影以及閉塞效果
  • 例如下圖:可以看到浮雕的凹凸深度明顯更大,且凹凸有自陰影效果

2.浮雕映射的實現

浮雕映射一般用射線步進二分查找決定uv偏移量

  • 第一步:射線步進部分,和視差貼圖一樣
  • 后邊:二分查找部分:通過射線步進找到合適的步進后,在此步進內使用二分查找來找到精確的偏移值

為什么不直接使用二分查找?

  • 會產生比較大的誤差
  • 下圖為例
  • 如果直接使用二分查找,在深度0和1的中間的1點,進一步為2點 -> 3點 ->Q點。但我們要的結果是P點,可以看到結果很明顯是錯誤的

3.視差閉塞貼圖(POM = Parallax Occlusion Mapping)

  • 相對于浮雕貼圖,不同之處在于最后一步
  • 浮雕貼圖是在確認最后步進之后進行二分查找(在迭代次數比較多的情況下,還是挺耗的)
  • 視差閉塞貼圖是在最后步進的兩端uv值進行采樣(下圖紅色箭頭),采樣之后再對這兩個結果進行插值,插值的結果作為P點最終的偏移值

優點:

  • 相對于浮雕映射,性能更好(最后只做插值,而浮雕要做二分查找)
  • 相對于陡視差貼圖,精確性更好

要求:

  • 因為最后要做插值,所以要求表面是相對比較平滑/連續的,如果有莫名的凸起結果可能會出錯

五、作業

結合先行版基礎光照介紹(一)將本次課程中所講的案例結合進先前的光照效果中

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19932.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDBC常見異常(10)—預編譯模式下占位符動態排序字段失效

場景需求 需要根據不同的列進行對應的排序操作,實現動態列名排序 類似🐟動態查詢或更新 但是JDBC預編譯模式下占位符的排序字段失效 SQL語句 分頁查詢 select * from (select t.*, rownum rn from(select * from emp order by empno desc) t where …

《java數據結構》--一篇解決二叉搜索樹!!

😸二叉搜索樹的概念 二叉搜索樹又名二叉排序樹,一般具有以下性質: 若它的左子樹不為空,則左子樹上所有節點的值都小于根節點的值若它的右子樹不為空,則右子樹上所有節點的值都大于根節點的值它的左右子樹也分別為二叉…

C語言高級編程及實例剖析.pdf

C語言高級編程及實例剖析.pdf C語言,作為一種經典且強大的編程語言,已經在多個領域得到廣泛應用。然而,要想真正掌握C語言的高級編程技巧,卻并非易事。本文將深入探討C語言的高級編程技巧,并結合實例進行詳細剖析&…

61. UE5 RPG 實現敵人近戰攻擊技能和轉向攻擊

在前面,我們實現了敵人的AI系統,敵人可以根據自身的職業進行匹配對應的攻擊方式。比如近戰戰士會靠近目標后進行攻擊然后躲避目標的攻擊接著進行攻擊。我們實現了敵人的AI行為,但是現在還沒有實現需要釋放的技能,接下來&#xff0…

HTML5 音頻 Audio 標簽詳解

HTML5 引入了 <audio> 標簽&#xff0c;允許開發者在網頁中直接嵌入音頻文件&#xff0c;而不需要依賴第三方插件。本文將全面介紹 <audio> 標簽的各種屬性&#xff0c;并通過實例代碼詳細說明其用法。 一、基礎用法 1. 基本結構 HTML5 中使用 <audio> 標…

通過定時器和脈沖控制LED

目錄 一、定時器 &#xff08;一&#xff09;定時器簡介 &#xff08;二&#xff09;定時器類型 1、常見定時器 2、定時器的主要功能 3、常規定時器 &#xff08;三&#xff09;定時器配置 1、定時器標準外設庫接口函數 2、定時器標準外設庫配置 二、PWM &#xff08…

匿名函數(lambda)

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 匿名函數是指沒有名字的函數&#xff0c;應用在需要一個函數&#xff0c;但是又不想費神去命名這個函數的場合。通常情況下&#xff0c;這樣的函數只…

【Qt】Qt界面美化指南:深入理解QSS樣式表的應用與實踐

文章目錄 前言&#xff1a;1. 背景介紹2. 基本語法3. QSS 設置方式3.1. 設置全局樣式3.2. 從文件加載樣式表3.3. 使用 Qt Designer 編輯樣式 總結&#xff1a; 前言&#xff1a; 在當今這個視覺至上的時代&#xff0c;用戶界面&#xff08;UI&#xff09;的設計對于任何軟件產…

智能制造案例專題|與MongoDB一起解鎖工業4.0轉型與增長的無限潛力!

MongoDB 智能制造 數字化技術的洪流在各個產業鏈的主干和枝節涌現。在工業制造領域&#xff0c;能否通過數字化技術實現各生產要素、生產環節之間的緊密配合&#xff0c;高效規劃、管理整個生產流程&#xff0c;是企業提升韌性、贏得競爭的關鍵。隨著工業4.0的深入發展和智能…

高級Java開發者的自我修養:深入剖析JVM垃圾回收機制及面試要點

在探索Java虛擬機&#xff08;JVM&#xff09;的奧秘過程中&#xff0c;垃圾回收機制&#xff08;GC&#xff09;是一個不可或缺的話題&#xff0c;尤其在面對大型應用和系統優化時顯得尤為重要。JVM的自動內存管理是Java編程語言中一項革命性的特性&#xff0c;它大大簡化了程…

測試記錄2:Ubuntu工程直接添加使用Eigen3源文件

直接將Eigen3源文件放入到工程目錄下使用&#xff0c;免安裝 1.新建空文件夾Test_eigen 2.創建將eigen下載的文件夾解壓&#xff0c;重命名為eigen3放入到Test_eigen 3.進入Test_eigen&#xff0c;創建main.cpp #include <iostream> #include <Eigen/Eigen>int m…

AI盒子在智慧加油站的應用

方案背景 為規范加油站作業&#xff0c;保障人民生命財產安全&#xff0c;《加油站作業安全規范》&#xff08;AQ 3010-2007&#xff09;中第五條規定&#xff1a;卸油作業基本要求&#xff0c;明確防靜電、防雷電、防火、人員值守、禁止其他車輛及非工作人員進入卸油區。 痛點…

數據結構基礎篇(4)

十六.循環鏈表 概念 循環鏈表是一種頭尾相接的鏈表&#xff08;最后一個結點的指針域指向頭結點&#xff0c;整個鏈表形成一個環&#xff09;優點 從表任一結點出發均可找到表中其他結點判斷終止 由于循環鏈表中沒有NULL指針&#xff0c;所以涉及遍歷操作時&#xff0c;終止條…

RocketMQ學習(2) 深入學習

RokcetMQ的介紹和基礎知識見這篇博客——RocketMQ學習(1) 快速入門 本篇為上一篇的深入學習&#xff0c;很多基礎知識不再贅述。 目錄 消息重復消費問題(去重;冪等)布隆過濾器 重試機制死信消息 SpringBoot集成RocketMQ集成SpringBoot發送不同消息模式(同步消息)異步消息單向消…

python下載指定URL的文件

import requests # 圖片的URL地址 url https://book.pep.com.cn/1212001402143/files/mobile/1.jpg?240301113921 # 發送HTTP GET請求 response requests.get(url) # 檢查請求是否成功 if response.status_code 200: # 打開一個文件用于寫入 with open(download…

實習碰到的問題w1

1.vueelementUI在輸入框中按回車鍵會刷新頁面 當一個 form 元素中只有一個輸入框時&#xff0c;在該輸入框中按下回車應提交該表單。如果希望阻止這一默認 行為&#xff0c;可以在 <el-form> 標簽上添加 submit.native.prevent 。 參考&#xff1a;element-ui 表單 form …

使用el-tab,el-tab-pane循環使用循環后不顯示下劃線問題

在vue項目中使用element-UI el-tab里的el-tab-pane是循環出來的&#xff0c;但是循環出來后選中tab不顯示下劃線了 文章目錄 問題問題展示效果問題代碼問題原因 解決方案解決后效果解決方案1代碼 解決方案2代碼 問題 問題展示效果 問題代碼 <el-tabs v-model"activeNa…

音量的對數表示與浮點數表示

音量用浮點數&#xff08;float&#xff09;和對數&#xff08;logarithmic scale&#xff09;表示各有特點和應用場景 浮點數&#xff1a;直接使用線性刻度表示音量&#xff0c;例如在0.0&#xff08;最小音量&#xff09;到1.0&#xff08;最大音量&#xff09;的范圍內。對…

『 Linux 』緩沖區(萬字)

文章目錄 &#x1f9a6; 什么是緩沖區&#x1f9a6; 格式化輸入/輸出&#x1f9a6; 刷新策略&#x1fab6; 塊緩沖(fully buffered)&#x1fab6; 無緩沖(unbuffered)&#x1fab6; 行緩沖(line buffered) &#x1f9a6; 現象解釋&#x1f9a6; exit()與_exit()&#x1f9a6; 進…

list 的實現

目錄 list 結點類 結點類的構造函數 list的尾插尾刪 list的頭插頭刪 迭代器 運算符重載 --運算符重載 和! 運算符重載 * 和 -> 運算符重載 list 的insert list的erase list list實際上是一個帶頭雙向循環鏈表,要實現list,則首先需要實現一個結點類,而一個結點需要…