法線紋理采樣+可視化Shader編輯器

法線貼圖,對主紋理凹凸顯示

? ? ? ? 建模原理

? ? ? ? ? ? ? ? 法線貼圖:切線空間,存儲xy切線,映射法線,法線信息存儲在切線空間中。

? ? ? ? ? ? ? ? 模型是否凹凸,是由模型頂點決定的,現在實現的法線貼圖,控制凹凸,實際上是配合

? ? ? ? ? ? ? ? 光照實現的,凹進去的部分,顏色偏暗,突出來的部分,顏色偏亮。

? ? ? ? 導入法線貼圖

????????????????

? ? ? ? ? ? ? ? 貼圖類型轉換為Normal Map,法線紋理類型。

? ? ? ? 法線貼圖計算

? ? ? ? ? ? ? ? 法線貼圖:存儲有與法線垂直的切線信息,切線信息存儲在切線空間中,使用內部

????????????????值(x切線,y切線)時,需要將法線轉換到世界空間中,再進行光照運算才能得到

????????????????正確的結果。調整凹凸深度的參數:用戶可配置,可以控制法線長短。

? ? ? ? Shader實現

? ? ? ? ? ? ? ? 加載兩張紋理:主紋理,光照法線紋理(切線空間存儲數據)

? ? ? ? ? ? ? ? 頂點著色器:

? ? ? ? ? ? ? ? ? ? ? ? 主紋理的UV偏移計算

? ? ? ? ? ? ? ? ? ? ? ? 法線紋理的UV偏移計算

? ? ? ? ? ? ? ? ? ? ? ? 計算切線空間到世界空間的轉換矩陣(可變),用于變換光照法線

? ? ? ? ? ? ? ? 片元著色器

? ? ? ? ? ? ? ? ? ? ? ? 解壓主紋理

? ? ? ? ? ? ? ? ? ? ? ? 解壓法線紋理,根據切線信息,轉換光照法線信息,將光照法線從切線空間,

????????????????????????轉到世界空間

????????????????????????拿法線紋理算出的光照法線,做光照運算。

相關實現代碼示例如下所示:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "CreateTest/PhongNormalTexture"
{Properties{//用于顯示材質紋理_MainTex("主紋理",2D)="white"{}//用于和主紋理混色_Color("混色",Color)=(1,1,1,1)//法線紋理_BumpTex("法線紋理",2D)="bump"{}//法線深度系數,可以控制法線高度_BumpScale("法線深度系數",Float) = 1_SpecularColor("高光反射材質顏色",Color) = (1,1,1,1)_Gloss("光暈系數",Range(8,256)) = 10}SubShader{Tags{"LightMode" = "ForwardBase"}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"//導入主紋理數據sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;//導入法線信息sampler2D _BumpTex;float4 _BumpTex_ST;float _BumpScale;//導入高光信息fixed4 _SpecularColor;float _Gloss;//從CPU過來的數據struct c2v{float4 vertex:POSITION;//從CPU傳遞過來的模型空間下,需要渲染的點float4 texcoord : TEXCOORD0; //因為兩張貼圖的像素,除顏色外完全重疊,所以紋理坐標點可以通用float4 tangent:TANGENT;  //光照法線紋理,因為要計算切線空間下的信息,所以需要渲染點的切線信息float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;  //模型空間到裁剪空間轉換后的點float4 uv:TEXCOORD1;  //因為要算出兩張紋理的uv坐標,所以做一個float4,xy存儲主紋理UV,zw存儲法線紋理UVfloat4 MatrixRowOne:TEXCOORD2;  //用于傳遞從頂點著色器計算好的轉換矩陣float4 MatrixRowTwo:TEXCOORD3;float4 MatrixRowThree:TEXCOORD4;};v2f vert(c2v data){v2f r;r.pos = UnityObjectToClipPos(data.vertex);//兩張紋理的縮放和偏移可能不同,所以分別計算uv偏移信息,存儲在v2f.uvr.uv.xy = data.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;r.uv.zw = data.texcoord.xy * _BumpTex_ST.xy + _BumpTex_ST.zw;//CPU傳遞過來的切線存儲在模型空間下//法線紋理中的,光照法線推算信息,是存儲在切線空間下的//CPU傳遞過來的切線信息與法線紋理中的切線信息,有轉換關系,所以可以推算出一個轉換矩陣用于切換法線//計算出來的轉換矩陣應該是從(切線空間到模型空間)的轉換//但是我們需要的是計算(從切線空間到世界空間)的轉換矩陣(因為最終的光照運算,需要在世界空間中完成)//所以應該先把CPU傳遞過來的切線信息,轉換到世界空間下//再計算切線的轉換矩陣,這時就能得到從(切線空間,到世界空間)的轉換矩陣//擁有了轉換矩陣,就可以將法線紋理中,求解的法線信息,從切線空間,轉換到世界空間下,進而可以計算光照//世界坐標系下的點的位置(片元著色器計算光照需求)float4 worldPos = mul(unity_ObjectToWorld, data.vertex);//世界空間下渲染點的法線信息float3 worldNormal = mul((float3x3)unity_ObjectToWorld, data.normal);//世界空間下切線的方向向量float3 worldTangent = mul((float3x3)unity_ObjectToWorld, data.tangent.xyz);//世界空間下計算與切線和法線垂直的線的方向向量(用于計算轉換矩陣)float3 worldBinormal=cross(worldNormal, worldTangent)* data.tangent.w;//需要將轉換矩陣,傳遞給片元著色器,用于轉換切線空間下的法線到世界空間中r.MatrixRowOne = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);r.MatrixRowTwo = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);r.MatrixRowThree = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);return r;}fixed4 frag(v2f data) :SV_Target{//世界空間下的點float3 worldPos = float3(data.MatrixRowOne.w,data.MatrixRowTwo.w,data.MatrixRowThree.w);//計算法線紋理中法線信息(重點),解出的法線在切線空間//解法線前,需要先對法線紋理貼圖進行采樣fixed3 bump = UnpackNormal(tex2D(_BumpTex, data.uv.zw));//通過縮放值,影響凹凸感bump.xy *= _BumpScale;//計算法線高度(數學公式)//法線還沒有轉換空間,所以計算出的法線,還在切線空間下bump.z = sqrt(1 - max(0, dot(bump.xy, bump.xy)));//通過頂點著色器傳遞過來的轉換矩陣,轉換法線,從切線空間到世界空間bump = float3(dot(data.MatrixRowOne.xyz, bump), dot(data.MatrixRowTwo.xyz, bump), dot(data.MatrixRowThree.xyz, bump));//解主紋理fixed4 texColor = tex2D(_MainTex, data.uv.xy) * _Color;//計算漫發射光照fixed3 diffuse = _LightColor0.rgb * texColor.rgb * max(0, dot(normalize(bump), normalize(_WorldSpaceLightPos0.xyz)));//計算高光反射光照fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos);fixed3 refDir = normalize(reflect(-_WorldSpaceLightPos0.xyz, normalize(bump)));fixed3 specular = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0, dot(viewDir, refDir)), _Gloss);//Phong光照運算fixed3 color = UNITY_LIGHTMODEL_AMBIENT.xyz * texColor.rgb + diffuse + specular;return fixed4(color, 1);}ENDCG}}Fallback "Diffuse"
}

其實現效果如下圖:

左側為Standard的shader效果,右側為上面代碼下的shader效果,右側較左邊多了高光反射的相應數據,考慮到磚墻等一些粗糙表面現實情況下不會有如此明顯的高光,應用此shader文件的同學可以將Phong光照模型的公式中的高光反射部分去除,在其他需要高光反射的情況下再進行視情況添加即可,法線貼圖下第一個屬性值為法線深度系數(數值0.6處,由于Shader文件未設置成UTF-8導致的中文亂碼,讀者可自行設置Shader文件的格式或采用英文命名),可通過調節系數對應加強法線紋理效果。

以下內容作者提供一個網址,方便讀者下載Amplify Shader Editor,可找到該插件的網址如下:

amplify_shader_pack unity3D_游戲3d模型 免費下載 - 愛給網

插件中提供了很多較高質量動態Shader,有需要的可自行下載。

例:

導入Unity包后即可使用該可視化Shader編輯器,使用的Unity包例:

使用編輯器的過程:

若兩邊窗口未展開,點擊左右上角的銀灰色方框即可展開,部分使用示例如下:

更改Shader名稱:

添加并編輯某一屬性:(以Texture Sample [T]為例)

實現效果如圖:

左側黃色按鈕,黃色為未保存,單擊使其變為綠色,則成功保存期間的設置。

剩余屬性可自行探索。

實現上面代碼的功能對應在可視化編輯器中的操作結果如下所示:

其在檢查器窗口的情況如下:

該系列專欄為網課課程筆記,僅用于學習參考。??????

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

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

相關文章

OID是什么?

什么是 OID? OID 是 Object Identifier(對象標識符) 的縮寫,是SNMP(Simple Network Management Protocol,簡單網絡管理協議)中用來唯一標識被管理對象(比如設備的某項信息)的一串數字。

STM32 ZIBEE DL-20 無線串口模塊

一.配置方法 二.串口中斷 u8 i; u16 buf[20],res; u8 receiving_flag 0; // 新增一個標志,用于標記是否開始接收數組 void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中斷{res USART_ReceiveData(USART1);if(receiv…

全感官交互革命:當 AI 大模型學會 “看、聽、說、創”

引言:從 “文字對話” 到 “全感官體驗”,AI 正在重塑人類認知邊界 當 AI 不再局限于文本對話,而是能 “看懂” 圖像、“聽懂” 語音、“生成” 視頻,并將這些模態無縫融合時,一場關于人機交互的革命已然開啟。DeepSe…

C++模板知識

目錄 引言 一、非類型模板參數 二、類模板的特化 (一)概念 (二)函數模板特化 (三)類模板特化 1. 全特化 2. 偏特化 (四)類模板特化應用示例 三、模板的分離編譯 …

Pillow 移除或更改了 FreeTypeFont.getsize() 方法

w, h self.font.getsize(label) # text width, height AttributeError: FreeTypeFont object has no attribute getsize 在Pillow 項目的變更日志里可以查到哪個版本移除了 getsize() 方法,Pillow倉庫: Releases python-pillow/Pillow GitHub 因為…

Matlab自學筆記

一、我下載的是Matlab R2016a軟件,打開界面如下: 二、如何調整字體大小,路徑為:“主頁”->“預設”->“字體”。 三、命令行窗口是直接進行交互式的,如下輸入“3 5”,回車,就得到結果“…

VR汽車線束:汽車制造的新變革

汽車線束,作為汽車電路網絡的主體,宛如汽車的 “神經網絡”,承擔著連接汽車各個部件、傳輸電力與信號的重任,對汽車的正常運行起著關鍵作用。從汽車的發動機到儀表盤,從傳感器到各類電子設備,無一不是通過線…

目標檢測YOLO實戰應用案例100講-基于多級特征融合的小目標深度檢測網絡

目錄 知識儲備 基于多級特征融合的小目標深度檢測網絡實現 一、環境配置 二、核心代碼實現 1. 多級特征融合模塊(models/fpn.py ) 2. 主干網絡(models/backbone.py ) 3. 檢測頭(models/detector.py ) 三、完整網絡架構(models/net.py ) 四、訓練代碼(train.p…

【云原生】基于Centos7 搭建Redis 6.2 操作實戰詳解

目錄 一、前言 二、Redis 6.2 安裝過程 2.1 下載安裝包 2.2 安裝包解壓 2.3 安裝包編譯 2.3 安裝 2.4 啟動redis 2.4.1 前臺啟動(不推薦) 2.4.2 后啟動(推薦) 2.4.3 關閉redis服務 2.4.4 設置客戶端連接 三、寫在最后 …

云計算-容器云-服務網格

服務網格:創建VirtualService(3分) ? 將Bookinfo應用部署到default命名空間下,為Bookinfo應用創建一個名為reviews的VirtualService,要求來自名為Jason的用戶的所有流量將被路由到reviews服務的v2版本。(需要用到的軟件包:ServiceMesh.tar.gz) # 上傳解壓 tar -xf Se…

【Res模塊學習】結合CIFAR-100分類任務學習

初次嘗試訓練CIFAR-100:【圖像分類】CIFAR-100圖像分類任務-CSDN博客 1.訓練模型(MyModel.py) import torch import torch.nn as nnclass BasicRes(nn.Module):def __init__(self, in_cha, out_cha, stride1, resTrue):super(BasicRes, sel…

愛勝品ICSP YPS-1133DN Plus黑白激光打印機報“自動進紙盒進紙失敗”處理方法之一

故障現象如下圖提示: 用戶的愛勝品ICSP YPS-1133DN Plus黑白激光打印機在工作過程中提示自動進紙盒進紙失敗并且紅色故障燈閃爍; 給出常見故障一般處理建議如下: 當您的愛勝品ICSP YPS-1133DN Plus 黑白激光打印機出現“自動進紙盒進紙失敗”…

Flinkcdc 實現 MySQL 寫入 Doris

Flinkcdc 實現 MySQL 寫入 Doris Flinkcdc 實現 MySQL 寫入 Doris 一、環境配置 Doris:3.0.4 JDK 17 MySQL (業務數據庫):5.7 MySQL(本地數據庫):5.7 Flink:flink-1.19.1 flinkc…

【Linux庖丁解牛】—環境變量!

目錄 1. 環境變量 1.1 概念介紹 1.2 命令行參數 1.3 一個例子,一個環境變量 1.4 認識更多的環境變量 1.5 獲取環境變量的方法 a. 指令操作 b. 代碼操作 1.6 理解環境變量的特性 a.環境變量具有全局特性 b.補充兩個概念(為后面埋一個伏筆) 1. 環境變量 …

LangChain4j +DeepSeek大模型應用開發——7 項目實戰 創建硅谷小鹿

這部分我們實現硅谷小鹿的基本聊天功能,包含聊天記憶、聊天記憶持久化、提示詞 1. 創建硅谷小鹿 創建XiaoLuAgent package com.ai.langchain4j.assistant;import dev.langchain4j.service.*; import dev.langchain4j.service.spring.AiService;import static dev…

普通 html 項目也可以支持 scss_sass

項目結構示例 下載vscode的插件Live Sass Compiler 自動監聽編譯scss 下載插件Live Server 用于 web 服務器,打開 html 文件到瀏覽器,也可以不用這個,自己用 nginx 或者寶塔其他 web 工具 新建一個 index.scss打開,點擊 vscode 底…

網工_IP協議

2025.02.17:小猿網&網工老姜學習筆記 第19節 IP協議 9.1 IP數據包的格式(首部數據部分)9.1.1 IP協議的首部格式(固定部分可變部分) 9.2 IP數據包分片(找題練)9.3 TTL生存時間的應用9.4 常見…

SQL語句練習 自學SQL網 在查詢中使用表達式 統計

目錄 Day 9 在查詢中使用表達式 Day 10 在查詢中進行統計 聚合函數 Day 11 在查詢中進行統計 HAVING關鍵字 Day12 查詢執行順序 Day 9 在查詢中使用表達式 SELECT id , Title , (International_salesDomestic_sales)/1000000 AS International_sales FROM moviesLEFT JOIN …

基于機器學習的輿情分析算法研究

標題:基于機器學習的輿情分析算法研究 內容:1.摘要 隨著互聯網的飛速發展,輿情信息呈現爆炸式增長,如何快速準確地分析輿情成為重要課題。本文旨在研究基于機器學習的輿情分析算法,以提高輿情分析的效率和準確性。方法上,收集了近…

菲索旋轉齒輪法:首次地面光速測量的科學魔術

一、當齒輪邂逅光束:19世紀的光速實驗室 1849年,法國物理學家阿曼德菲索(Armand Fizeau)在巴黎郊外的一座莊園里,用一組旋轉齒輪、一面鏡子和一盞油燈,完成了人類首次地面光速測量。他的實驗測得光速為315…