【Unity Shader入門精要 第7章】基礎紋理(一)

1. 紋理映射

每一張紋理可以看作擁有一個屬于自己的2D坐標空間,其橫軸用U表示,縱軸用V表示,因此也稱為UV坐標空間。

UV空間的坐標范圍為[0,0]到[1,1],在Unity中,UV空間也是從左下到右上,即紋理的左下角對應的UV坐標為[0,0],紋理右上角對應的UV坐標為[1,1]

在美術導出模型資源時,會通過UV展開將模型每個頂點對應的UV坐標存儲到頂點信息中。渲染時通過頂點(或片元)的UV坐標映射到紋理上的某一點,這樣就可以通過采樣每一個頂點(或片元)對應的紋理上的顏色將紋理顯示出來。

2. 紋理基礎設置

以Unity 2021為例,一張紋理的Inspector面板大致如下
在這里插入圖片描述
其中紅框部分是本節主要關注的部分

  • Generate Mip Maps

    • 勾選后會提前進行濾波,生成不同采樣等級的Mip Map紋理
    • 渲染時根據屏幕像素對應的紋理范圍從對應等級的Mip Map紋理中進行采樣
    • 由于生成了新的紋理,因此會占用更多的內存空間
  • Wrap Mode
    UV坐標空間自身的范圍雖然只有0到1,但實際采樣時,頂點映射的UV坐標可能超過這個范圍,WrapMode屬性決定了采樣的UV坐標超過[0, 1]范圍時的處理方式

    • Repeat:重復采樣,即超過范圍時舍棄整數部分只按小數部分采樣,比如(1.1, 1.2)實際會按照(0.1, 0.2)采樣
    • Clamp:超過[0, 1]的部分延用相應邊緣的值(0或者1)
  • Filter Mode
    決定紋理采樣的濾波方式

    • Point:就近點采樣
    • Bilinear:雙線性插值
    • Trilinear:三線性插值

關于MipMap和濾波的原理可以參照【Unity Shader入門精要 第7章】基礎紋理補充內容:MipMap原理

3. 在Shader中使用紋理

  • 創建Chapter_7_BaseTexture_Mat 作為測試材質
  • 創建Chapter_7_BaseTexture作為測試shader,并賦給Chapter_7_BaseTexture_Mat 材質
  • 場景中創建膠囊體,將Chapter_7_BaseTexture_Mat 材質賦給膠囊體
  • 場景中添加一盞平行光,并調整平行光角度

在Shader中,我們通過對紋理采樣得到的顏色來代替之前固定的漫反射顏色,并在片元著色器中進行逐像素的光照計算,得到最終的效果:

  • 在Properties中添加屬性 _MainTex(“MainTex”, 2D) = “white”{} 用于設置紋理,此時選中膠囊體可在Inspector面板中看到如下紋理設置選項
    在這里插入圖片描述
    • Tiling:平鋪數量,可以理解為反向的縮放度,值越大單位空間平鋪數量越多,相當于對紋理縮小,反之相當與放大
    • Offset:偏移
  • 在CG代碼段中添加與屬性同名的變量 _MainTex來使用面板中設置的紋理,其類型為 sampler2D
  • 頂點著色器中輸入的uv坐標是模型導出時頂點對應的uv坐標,為了能夠得到正確的紋理采樣結果,除了考慮頂點自身的uv坐標外,還需要考慮面板中對要采樣的紋理設置的縮放和偏移,這部分信息可通過在Shader中聲明 XXX_ST 的變量獲得,其中XXX為紋理屬性的名字,當前Shader中也就是 _MainTex_ST,該變量類型為float4,其中xy表示縮放,zw表示平移
  • 通過 input.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw 即可得到實際采樣使用的uv坐標,也可以通過內置的TRANSFORM_TEX(_MainTex, input.uv)方法獲得,此時引擎會自己使用名為 _MainTex_ST 的變量進行上述計算,因此即使使用內置方法計算uv也需要聲明_ST變量
  • 最后在著色器中通過 tex2D(_MainTex, i.uv) 方法即可對紋理進行采樣獲得顏色,我們以該顏色作為物體自身的漫反射顏色系數帶入漫反射光照計算

Shader如下:

Shader "MyShader/Chapter_7/Chapter_7_BaseTexture"
{Properties{_MainTex("MainTex", 2D) = "white"{}_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 10}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 worldPos : TEXCOORD1;float3 worldNormal : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Specular;half _Gloss;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);o.worldPos = mul(unity_ObjectToWorld, i.vertex);o.worldNormal = mul(i.normal, (float3x3)unity_WorldToObject);o.uv = TRANSFORM_TEX(i.uv, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed4 _albedo = tex2D(_MainTex, i.uv);fixed3 _diffuse = _LightColor0.rgb * _albedo.rgb * saturate(dot(_worldNormal, _worldLight));float3 _worldRefl = normalize(reflect(-_worldLight, _worldNormal));float3 _worldView = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow( saturate(dot(_worldRefl, _worldView)),_Gloss);return fixed4(_ambient + _diffuse + _specular, 1);}ENDCG}}}

效果如下:
在這里插入圖片描述

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

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

相關文章

測試萌新Python學習(五)接口自動化測試requests

requests 接口自動化測試requests庫基本實現請求-GET基本實現請求-POST基本實現請求-補充 sessionCookie和Session案例params 接口自動化測試 概念程序驅動代替人工驅動去實現接口測試 實現方式 測試工具(jmeter, postman, …)編碼工具(python, java, …) 比較 工具 優點:…

Network Compression

聽課(李宏毅老師的)筆記,方便梳理框架,以作復習之用。本節課主要講了Network Compression,包括為什么要壓縮,壓縮的主要手段(pruning,knowledge distillation,parameter quantization,architect…

Elasticsearch_sql插件安裝+使用

一、安裝 前提是你先安裝好了elasticseach,安裝過程在我上一篇博客有說,可以看一下。 在elasticsearch容器啟動的情況下,進入到elasticsearch容器,Elasticsearch_sql倉庫,比如我的版本是8.11.2,那么我就選…

[藍橋杯]真題講解:抓娃娃(思維+二分)

[藍橋杯]真題講解&#xff1a;抓娃娃&#xff08;思維二分&#xff09; 一、視頻講解二、正解代碼1、C2、python33、Java 一、視頻講解 [藍橋杯]真題講解&#xff1a;抓娃娃&#xff08;思維二分&#xff09;&#xff09; 二、正解代碼 1、C #include<bits/stdc.h> #d…

fastapi+vue實現導入Excel表格的功能

1.前端部分 1.1 api設置 // 導入用戶 export function uploadUser(data) {const formData new FormData();formData.append(file, data); // data 是從文件上傳事件中獲取的文件對象return request({url: /users/upload,method: post,headers: {Content-Type: multipart/fo…

前端CSS3基礎1(新增長度單位,盒子模型,背景,邊框,文本屬性,漸變,字體,2D變換,3D變換)

前端CSS3基礎1&#xff08;新增長度單位&#xff0c;盒子模型&#xff0c;背景&#xff0c;邊框&#xff0c;文本屬性&#xff0c;漸變&#xff0c;字體&#xff0c;2D變換&#xff0c;3D變換&#xff09; CSS3 新增長度單位CSS3 新增盒子模型相關屬性box-sizing怪異盒模型box-…

實現簡易版Vuex

從實現一個簡單的 Vuex 類來了解 Vuex 的工作原理。 實現思路 Vuex 下擁有 install 方法和 Store 類。即創建一個 Vuex 的模塊&#xff0c;這個模塊導出 install 方法和 Store 類。 install 方法 Vuex 是 Vue 的一個插件&#xff0c;所以需要實現 Vue 插件約定的 install 方…

Linux:ftp文件傳輸實驗

Linux&#xff1a;ftp文件傳輸實驗 實驗實現 # 安裝對應軟件 [rootserver120 ~]# dnf install vsftpd -y [rootserver120 ~]# dnf install lftp -y# 關閉防火墻以及開啟服務 [rootserver120 ~]# systemctl disable --now firewalld [rootserver120 ~]# systemctl enable --no…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置條件 環境需要支持VRRP協議 環境需要配置好yum源 變更影響面 變更不會影響其他組件 配置lb(需要客戶側配置并提供LB地址) 轉發方式選擇 主備 監聽端口為8080、8440、8441 協議為tcp 后端監聽選擇kde-offline1為主

【RAG 論文】UPR:使用 LLM 來做檢索后的 re-rank

論文&#xff1a;Improving Passage Retrieval with Zero-Shot Question Generation ???? EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 論文&#xff1a;Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

參考https://blog.csdn.net/haydenwang8287/article/details/113541512 頭部三板斧 戰略能不能落地、文化能不能得到傳承、人才能不能得到保障。 頭部三板斧適用的核心場景有三個&#xff1a;一是戰略不靠譜&#xff1b;二是組織效率低、不聚心&#xff1b;三是人才跟不上。對…

c++ 各版本特性介紹

c C是一種高級編程語言&#xff0c;以其強大的功能、靈活性和高效性而聞名。它是由Bjarne Stroustrup在20世紀80年代初期在貝爾實驗室開發的&#xff0c;作為C語言的一個擴展。C不僅包含了C語言的所有特性&#xff0c;還引入了面向對象編程&#xff08;OOP&#xff09;的概念&…

基于Vue3+ElementPlus項目,復制文字到剪貼板功能實踐指南,揭秘使用js-tool-big-box工具庫的核心優勢

在前端開發項目中&#xff0c;很多時候有那么一個場景&#xff0c;就是要求將一段文案復制下來&#xff0c;這段文案可能是一串很長的id&#xff0c;可能是一條命令語句&#xff0c;可能是一小段文案&#xff0c;復制到剪貼板上。這樣有利于用戶復制到其他地方去&#xff0c;使…

自然資源-城鄉規劃行業未來二十年將何去何從?

自然資源-城鄉規劃行業未來二十年將何去何從? 城鄉規劃行業未來風口在以下幾個方向&#xff0c;看好啦&#xff01;緊跟國家發展戰略和政策背景。 1.大數據的城市規劃應用。 包含:公共數據平臺的搭建CIM&#xff0c;數據賦能治理&#xff0c;城市規劃中大數據應用的研究 等…

微軟必應bing國內官方代理商,廣告賬戶如何開戶?

微軟必應Bing作為全球知名的搜索引擎之一&#xff0c;其廣告平臺為眾多企業提供了廣闊的市場空間和精準的推廣機會。對于中國內地的企業而言&#xff0c;通過必應Bing開展國內廣告推廣不僅能夠觸及更廣泛的潛在客戶群體&#xff0c;還能有效提升品牌影響力。通過微軟必應Bing國…

【算法作業】均分卡牌,購買股票

問題描述 John 有兩個孩子&#xff0c;在 John病逝后&#xff0c;留下了一組價值不一定相同的魔卡&#xff0c; 現在要求你設計一種策略&#xff0c;幫John的經管人將John的這些遺產分給他的兩個孩子&#xff0c;使得他們獲得的遺產差異最小&#xff08;每張魔卡不能分拆&#…

搜索引擎的設計與實現(三)

目錄 5 系統詳細實現 5.1實現環境配置 5.2功能實現 5.2.1 建立索引 5.2.2 文件搜索實現 5.2.3 數據庫的連接配置 5.2.4 數據庫搜索實現 5.2.5 后臺數據編輯實現 前面內容請移步 搜索引擎的設計與實現&#xff08;二&#xff09; 免費源代碼&畢業設計論文 搜索…

git-刪除workspace.xml的跟蹤

問題描述 .gitignore 文件內容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 復現記錄

1 環境配置 下載項目&#xff0c;一定要 git 下載全項目&#xff0c;下載完后要檢查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 環境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5來搭建目標檢測系統(附可視化界面+功能介紹+源代碼)

前言:Hello大家好,我是小哥談。PyQt5是一個Python綁定的Qt庫,是用于創建圖形用戶界面(GUI)和其他應用程序組件的工具包。PyQt5提供了許多GUI元素,如按鈕、文本框、標簽等,也提供了許多Qt的功能,如網絡、數據庫、XML等。通過PyQt5可以在Python中使用Qt的豐富功能和強大的工…