[OpenGL] 法線貼圖

目錄

一 為什么要使用法線貼圖

二 二種不同法線方式的使用

2.1 插值法線

2.1 法線貼圖


本章節源碼?點擊此處

一 為什么要使用法線貼圖

法線貼圖我們可以使用更少的頂點表現出同樣豐富的細節。高精度網格和使用法線貼圖的低精度網格幾乎區分不出來。所以法線貼圖不僅看起來漂亮,它也是一個將高精度多邊形轉換為低精度多邊形而不失細節的重要工具。

我們知道不是所有的物體表面都是光滑平整的平面,比如我么要繪制一個人臉,但人臉會由,頭發,五官,甚至是微表情等組成這些都是具有凹凸感的,那我們該如何體現出這種凹凸感呢?

  • 第一種方式: 傳入大量的頂點坐標,讓大量的頂點來幫我們實現人臉中的各個細節。但這無疑是會增大額外的開銷。
  • 第二種方式:?我們使用法線貼圖,來為每個像素上都設置不同的法線值,這樣實現的效果和大量的頂點坐標幾乎一樣。

如下圖所示: 左邊第一個是傳入了上百萬的頂點坐標實現的效果,而最中間的是傳入了500個頂點實現的效果,最后一個是在中間的基礎上運用的法線貼圖實現的效果,他們的效果幾乎是一樣的。

二 二種不同法線方式的使用

  • 通俗的理解法線的作用是在計算光照時根據角度的不同,反映在顏色上的變化,比如如果法線與光線垂直那么就會光照效果最大,顏色最亮。
  • 一般有兩種不同方式來傳遞給GPU法線,一種是采樣插值法線,也就是為每個頂點傳遞它的法線,另一種是采用法線貼圖

2.1 插值法線

  • 觀察下面這個圖我們是使用插值法線得到的效果,我們傳入的是6個頂點也就是2個三角形,而這6個頂點位于同一個平面,我們使用插值法線一般也是會插入6個法線向量,但同一個平面我們此時傳入的法線其實是相同的,那會造成什么問題呢?
  • 例如,磚塊的表面。磚塊的表面非常粗糙,顯然不是完全平坦的:它包含著接縫處水泥凹痕,以及非常多的細小的空洞。如果我們在一個有光的場景中看這樣一個磚塊的表面,問題就出來了。下圖中我們可以看到磚塊紋理應用到了平坦的表面,我們并看不到磚縫以及磚塊表面的一些細節或者說不是很明顯。

  • 對于插值法線,同一個片段上我們可以理解為法線是相同的,以光的視角來說,這個表面就是完全平坦的,即使本身提供的紋理圖片上可能會看到一些磚縫但這并不能完全體現出這種凹凸不平的平面的細節。
  • 我們可以使用一種技術,讓每個頂點擁有自己單獨的法線,當光源照射到頂點時,根據法線的不同就能體現出更過的細節。替代一個面上所有fragment使用同一個法線的技術叫做法線貼圖(normal mapping)或凹凸貼圖(bump mapping)

2.1 法線貼圖

原理

  • 在使用法線貼圖前我們應該了解一下法線貼圖的原理。其實就是用一個2D的紋理來保存每個片段的法線.
  • 紋理中的rgb就剛好對應了法線的xyz坐標
  • 這也就是我們為什么看到下面這個紋理大部分是藍色,而在磚縫中表現的偏綠色,是因為這個紋理貼圖大部分是指向z軸的也就是rgb中的b(藍色),而磚縫中就偏向于綠色也就是指向y軸。

  • 這里有個值得注意的點,紋理中的像素顏色是0-1之間的,我們需要把它轉換到標準坐標中的-1-1之間。
        vec3 normTemp = vec3(texture(texture_normal1,TexCoords));norm = normalize(normTemp * 2.0 -1.0);
  • 這樣我們在片段著色器中,就能夠獲取到每個片段上對于的法線值了(其實就是紋理顏色值)。

效果:

  • 這樣我們就能看到這個墻壁的諸多細節了。

三 代碼開關

  • 在源碼中我們使用一個開關bIsTexture,當我們點擊dockwidgt中的插值法線時,該值為false,則采用默認的插值法線來計算,如果點擊法線貼圖改值為true,采用法線貼圖來渲染

 vec3 norm;if(bIsTexture == true){vec3 normTemp = vec3(texture(texture_normal1,TexCoords));norm = normalize(normTemp * 2.0 -1.0);}else{norm = normalize(Normal);}

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

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

相關文章

UE5中搭建一個簡單的海島

本文將用UE的WaterSystem與地形搭建一個簡單的海島,通過WaterSystem的參數設置,可以更好的自定義海岸線等效果。 1.基礎風貌 1.1.首先新建一個Basic基礎場景,切換到地形編輯模式刷出一塊高地,用于沙灘。 1.2.引入UE官方插件Wat…

[IMX6ULL驅動開發]-Linux對中斷的處理(一)

目錄 中斷概念的引入 ARM架構中斷的流程 異常向量表 Linux系統對中斷的處理 ARM對程序和中斷的處理 Linux進程中斷處理 中斷概念的引入 如何理解中斷,我們可以進行如下抽象。把CPU看做一個母親,當它正在執行任務的時候,可以看為是一個母…

【BSP開發經驗】簡易文件系統digicapfs實現方式

文章目錄 背景Linux vfs框架介紹數據結構系統調用openwriteread 總體框架 Linux 磁盤高速緩存機制標準文件訪問同步文件訪問異步文件訪問buffer_head 如何實現一個簡單的文件系統blkdevfs注冊文件系統產生一個文件讓文件變得可讀可寫 背景 在新的分區升級啟動方案中需要分別實…

OGG幾何內核-BRepBuilderAPI_MakeEdge學習

OGG幾何內核fork自OCCT 7.7.0, BRepBuilderAPI_MakeEdge是幾何內核的一個重要和基礎的功能,也十分復雜,因為要支持line、circle、ellipse,parabola,hyperbola,circle,beziercurve,b…

springboot常用的注解

啟動注解(Spring Boot 應用的入口注解)@SpringBootApplication @SpringBootApplication 是一個注解,它是 Spring Boot 應用的入口注解,用于表示一個應用程序的主類。這個注解通常被放置在包含 main() 方法的類上。@SpringBootApplication 是一個組合注解,整合了以下三個注…

亞馬遜測評還能做嗎?

只能說測評不是唯一的手段,但是推銷量的一把好手。首先測評能讓listing快速成長,短期內有望成為爆款,速度快,利潤高,回款快。相對其他推廣,測評無疑是有效,省培養listing的方法。其次新品前期太…

設計模式六大原則

開閉原則:對修改封閉,對拓展開放。 單一職責原則:類的功能要專一。 里氏代換原則:子類繼承父類的時候,除添加新的方法完成新增功能外,盡量不要重寫父類方法。 依賴倒轉原則:類要依賴接口&…

Hsql每日一題 | day01

前言 就一直向前走吧,沿途的花終將綻放~ 題目:找出連續活躍3天及以上的用戶 create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01),(A,2023-10-02),(A,2023-10-03),(A,2023-10-04),(B,2023-10-01),(B…

代碼隨想錄打卡第38天:動態規劃解決編輯距離和回文串

1.72編輯距離 1.問題描述 找到其中需要進行操作的最少次數。 2.問題轉換 大體思路可以參照前面的兩個字符串的刪除操作。添加操作可以將其看做是一個另類的刪除操作,所以最后全部都可以看做是一個刪除操作 3.解題思路 每一個位置的word1[i]和word2[j]都有兩種…

RTOS原理和應用總結

RTOS的作用 RTOS一般應用在中低端處理器當中,這里舉一個筆者日常開發遇到的案例來說明RTOS的作用。 假設你有一個設備,這個設備的外圍硬件很多,假設有LED、一個網口、若干RS232等等。 在沒有RTOS的時候,我們用裸機編程來寫&…

HTML5 多媒體應用技術

目錄 多媒體元素 audio元素video元素多媒體事件與JavaScript交互音頻和視頻軌道(Track)媒體API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

數據庫同步軟件,天不生PanguSync萬古如長夜

在信息時代的海洋中,數據是那永不熄滅的燈塔,照亮了科技發展的航道。然而,隨著數據的膨脹和應用場景的多樣化,如何確保這些寶貴資源在不同平臺、不同設備間實時更新、保持一致性,便成了一道亟待解決的難題。于是&#…

Android File Transfer for mac(強大的安卓文件傳輸工具) 直裝版

Android File Transfer是一款專門為Mac用戶設計的軟件,它用于在Android設備與Mac之間傳輸文件。這款軟件提供了簡單直觀的操作界面,使用戶能夠輕松地在Android設備和Mac之間傳輸和管理文件。 下載地址:https://www.macz.com/mac/7099.html?i…

使用python實現socket進行消息傳輸-demo

Socket 是什么 Socket 是一種在計算機網絡中用于實現進程間通信的一種機制。它是網絡編程中的重要概念,通過它可以在不同的計算機之間進行數據傳輸和通信。Socket 可以用于實現各種網絡應用,包括客戶端-服務器模型、P2P 應用等。基本上,Sock…

自動駕駛決策規劃算法——二次規劃

自動駕駛決策規劃算法第二章第二節(中) 參考線算法_嗶哩嗶哩_bilibili 動態規劃開辟的凸空間如下,兩條橙色線之間: 黃色的點就意味著L的上下界,物理意義是當軌跡ss1時,L的范圍應該是(Lmin1,Lmax1)之間,這個范圍就是開辟…

學習日記.1

今天就是配置了droidbot的環境。主要的知識來源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme,注意只需要platform就好,sdk太大不用下載…

《Ai企業知識庫》-模型實踐-rasa開源學習框架-基礎理論-02

rasa官網 Conversational AI Platform | Superior Customer Experiences Start Here rasa簡介: Rasa是一個開源的機器學習框架,專門用于構建自動化的文本和語音對話系統,即聊天機器人。它允許開發者和企業創建定制化的對話體驗&#xff0c…

ubuntu設置root開機登錄,允許root用戶ssh遠程登錄

ubuntu與centos系統不同,默認root開機不能登錄。 1、輸入一下命令創建root密碼,根據提示輸入新密碼 sudo passwd root 2、打開gdm-autologin文件,將auth required pam_succeed_if.so user ! root quiet_success這行注釋掉,這行就…

el-upload 上傳多個視頻

<el-form-item label"視頻" prop"video_url"><el-uploadclass"upload-demo"ref"uploadRef":multiple"true":on-change"handleChange":before-remove"beforeRemove":before-upload"before…

Flutter 中的 EditableText 小部件:全面指南

Flutter 中的 EditableText 小部件&#xff1a;全面指南 在Flutter中&#xff0c;EditableText是一個低級別的文本編輯組件&#xff0c;它提供了構建自定義文本編輯界面的能力。與TextField和TextFormField不同&#xff0c;EditableText提供了更多的靈活性&#xff0c;允許開發…