第二天 開始Unity Shader的學習之旅之熟悉頂點著色器和片元著色器

Shader初學者的學習筆記

第二天 開始Unity Shader的學習之旅之熟悉頂點著色器和片元著色器


文章目錄

  • Shader初學者的學習筆記
  • 前言
  • 一、頂點/片元著色器的基本結構
    • ① Shader "Unity Shaders Book/Chapter 5/ Simple Shader"
    • ② SubShader
    • ③ CGPROGRAM和ENDCG
    • ④ 指明頂點著色器和片元著色器函數名稱
    • ⑤ 頂點著色器
    • ⑥ 片元著色器
  • 二、模型數據從哪來?
    • ① a2v
    • ② 語義中的數據從何而來
    • ③ v2f
    • ④ 如何使用屬性
  • 總結


前言

今天對入門精要第五章進行一個小小的總結和歸納,主要是學習頂點著色器和片元著色器的結構.


一、頂點/片元著色器的基本結構

Shader "Unity Shaders Book/Chapter 5/ Simple Shader"{SubShader														②{Pass{CGPROGRAM												③#pragma vertex vert										④#pragma fragment fragfloat4 vert (float4 : POSITION) : SV_POSITION			⑤{return mul (UNITY_MATRIX_MVP, v):}fixed4 frag() : SV_Target								⑥{return fixed4 (1.0, 1.0, 1.0, 1.0);}ENDCG}}
}

① Shader “Unity Shaders Book/Chapter 5/ Simple Shader”

該語句定義了Unity Shader的語義 – “Unity Shaders Book/Chapter 5/ Simple Shader”,這個名字有利于我們快速選擇到自定義的Shader.

② SubShader

你會發現,我們沒有聲明任何的材質屬性,因為Properties不是必須的, 同時在這個SubShader中沒有Tags, RenderSetup等,因此SubShader會使用默認的渲染設置和標簽設置.
并且我們在SubShader中定義的Pass也沒有設置Tags和RenderSetup.

③ CGPROGRAM和ENDCG

我們把cg代碼片段放在CGPROGRAM和ENDCG中;

④ 指明頂點著色器和片元著色器函數名稱

#pragma vertex name1
#pragma fragment name2

name1, name2是我們自己指定的函數名,可以告訴Unity,name1包含了頂點著色器的代碼,name2包含了片元著色器的代碼,這個函數的名字不一定要使用vertex和frag,但是我們一般用使用這兩個來定義函數,因為他們很直觀.

⑤ 頂點著色器

float4 vert (float4 : POSITION) : SV_POSITION
{return mul (UNITY_MATRIX_MVP, v):
}

需要再提一次,頂點著色器是逐頂點執行的, vert函數的輸入是float4類型的頂點位置,這是通過POSITION語義指定的,vert函數的輸出也是float4類型的,即頂點在裁剪空間的位置,由SV_POSITION的語義指定的;
POSITION 和 SV_POSITION都是Cg/HLSL的語義,他們是不可忽略的,他們會告訴Unity輸入和輸出,例如:POSITION告訴Unity,將模型的頂點坐標填充到參數v中,SV_POSITION告訴Unity,頂點著色器的輸出是裁剪空間的坐標,所以使用這些語義現在輸入輸出參數是非常有必要的.
再看頂點著色器的代碼,這一句代碼的含義就是將頂點坐標從模型空間轉換到裁剪空間.
補充:UNITY_MATRIX_MVP矩陣是Unity內置的模型觀察投影矩陣.

⑥ 片元著色器

fixed4 frag() : SV_Target
{return fixed4 (1.0, 1.0, 1.0, 1.0);
}

在片元著色器中,frag函數沒有任何輸入,他的輸出是一個fixed4類型的變量,并且使用了SV_Target語義進行限定,SV_Target也是HSLSL中的一個系統語義,他等同于告訴渲染器,把用戶的輸出顏色存儲到渲染目標中,這里將輸出到默認的幀緩存中.
片元著色器的代碼也很簡單,返回一個白色的fixed4變量.

二、模型數據從哪來?

我們如果想要得到模型上的每個頂點的紋理坐標和法線方向,那么我們就不能只是將float4作為頂點著色器的輸入了,我們就需要自己定義一個結構體,如下:

Shader "Unity Shaders Book/Chapter 5/ Simple Shader"
{Properties{_Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment fragfixed4 _Colorstruct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;}struct v2f{float4 pos : SV_Position;								fixed3 color : COLOR0;}v2f vert (a2v v) : SV_POSITION							{v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.color = v.normal * 0.5 + fixed3 (0.5, 0.5, 0.5);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 c = i.color;c *= _Color.rgb;return fixed4(c, 1.0);}ENDCG}}
}

① a2v

在上面的代碼中,我聲明了新的結構體a2v,這里面包含很多數據:模型空間的頂點坐標,法線方向,以及模型的第一套紋理坐標,這些都是通過特定的語義進行修飾的,unity支持的語義有:POSITION, TANGENT, NORMAL, TEXCOORD0, TEXCOORD1, TEXCOORD2, TEXCOORD3, COLOR等
注意:語義是不可以被忽略的

是不是很疑惑為什么要起名字為a2v,因為a是應用,v表示頂點著色器,a2v的意思就是從應用階段到頂點著色器.

② 語義中的數據從何而來

這些語義的數據是從哪來的呢?他們其實是由Mesh Render組件剔紅的,在每幀調用Draw Call的時候, Mesh Render組件會把它負責渲染的模型數據發送給Unity Shader.
我們知道,一個模型通常包含一組三角面片,每個三角面片由三個頂點組成,每個頂點又包含一些數據:頂點位置,法線,切線,紋理坐標,頂點顏色等,通過上面的方法,我們就可以在頂點著色器中訪問頂點的模型數據了.

③ v2f

我們在頂點著色器進行了一些變換之后,希望把模型的法線,紋理坐標等傳遞給片元著色器,那么這個傳遞過程是怎樣的呢?
我們首先定義了一個v2f的結構體,用于在頂點著色器和片元著色器之前傳遞信息,為了將模型渲染到屏幕上,我們必須在頂點著色器的輸出中定義一個變量,他的語義是SV_POSITION,COLOR0一般用于存儲顏色,也可由用戶自行定義.

④ 如何使用屬性

在上面的代碼中,我們聲明了屬性:_Color,為了可以在cg中訪問它,我們需要在Cg代碼片段中提前定義一個名稱和類型與Properties中屬性相匹配的變量.
下面表格記錄了屬性的類型和變量類型的匹配關系

ShaderLab屬性的類型Cg變量的類型
Color, Vectorfloat4, half4, fixed4
Range, floatfloat, half, fixed
2Dsampler2D
CubesamplerCube
3Dsampler3D

補充

uniform fixed4 _Color;

在上述Cg變量前,有uniform變量進行修飾,他僅僅用于提供一些關于該變量的初始值是如何指定和存儲的相關信息,在Unity Shader中是可以省略的.


總結

今天我對第五章的頂點著色器和片元著色器的知識進行了總結,為以后復雜的Unity Shader的學習打下了堅實的基礎!!!

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

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

相關文章

潯川社團官方聯合會維權成功

在2025.3.2日,我社團檢測文章侵權中,檢測出3篇文章疑似遭侵權,隨后,總社團聯合會立即聯系CSDN版權,經過17天的維權,至今日晚,我社團維權成功!侵權文章全部被設置為轉載。 在此&…

介紹一個測試boostrap表格插件的好網站!

最近在開發一個物業管理系統。用到bootstrap的表格插件bootstrap table,官方地址: https://bootstrap-table.com/ 因為是英文界面,對國人不是很友好。后來發現了小書童網站 IT小書童 - 為程序員提供優質教程和文檔 網站: IT小…

釘釘機器人

準備 參考官方文檔 已經完成成為釘釘開發者流程。已經完成創建應用流程。已經完成添加應用能力流程 企業內部需要企業管理員開通權限,我自己創建了一個組織,用自己的組織創建機器人就方便很多,很多權限無需單獨去申請了。 創建機器人 進…

Androidstudio實現引導頁文字動畫

文章目錄 1. 功能需求2. 代碼實現過程1. 編寫布局文件2. 實現引導頁GuideActivity 3. 總結4. 效果演示5. 關于作者其它項目視頻教程介紹 1. 功能需求 1、引導頁具有兩行文字(“疫情在前”和“共克時艱”),和向上的 圖標。 2、進入【引導頁】…

在線生成自定義二維碼

在線生成自定義二維碼 1. 引言 二維碼已成為現代互聯網的重要工具,廣泛應用于鏈接分享、支付、身份認證等場景。然而,很多在線二維碼生成工具功能有限,難以滿足個性化需求。如果你需要 自定義顏色、Logo、不同形狀的二維碼,那么…

藍橋杯 之 第27場月賽總結

文章目錄 習題1.抓豬拿國一2.藍橋字符3.藍橋大使4.拳頭對決 習題 比賽地址 1.抓豬拿國一 十分簡單的簽到題 print(sum(list(range(17))))2.藍橋字符 常見的字符匹配的問題,是一個二維dp的問題,轉化為對應的動態規劃求解 力扣的相似題目 可以關注靈神…

計算機的基本組合和工作原理

計算機的基本組成和工作原理可以概括為以下幾個核心部分: 一、計算機的基本組成(馮諾依曼體系結構) 現代計算機基于馮諾依曼體系結構,主要由以下五大部件組成: 控制器(Control Unit, CU) 功能&…

[思考記錄]兩則:宏觀視角、理想化

#宏觀視角# 昨天聽金老師講解了他初步整理的大模型宏觀概念關系圖,受益不少。圖上不僅是涵蓋了諸多概念,更厲害的應該在于把概念之間的關系進行了描述,更直觀展現了概念是如何與其他概念相互作用的。幫助從整體的角度去理解,以及透…

正則表達式:文本處理的瑞士軍刀

正則表達式:文本處理的瑞士軍刀 正則表達式(Regular Expression,簡稱 Regex)是一種用于匹配、查找和操作文本的強大工具。它通過定義一種特殊的字符串模式,可以快速地在文本中搜索、替換或提取符合特定規則的內容。正…

SQL 中UPDATE 和 DELETE 語句的深入理解與應用

在 SQL 中,UPDATE和DELETE語句是用于操作表數據的重要工具,它們允許我們對已存在的數據進行修改和刪除。 一、UPDATE 語句 (一)基本語法 UPDATE語句的基本語法如下: UPDATE table_name SET column1 value1, colum…

C 語 言 --- 掃 雷 游 戲(初 階 版)

C 語 言 --- 掃 雷 游 戲 初 階 版 代 碼 全 貌 與 功 能 介 紹掃雷游戲的功能說明游 戲 效 果 展 示游 戲 代 碼 詳 解game.htest.cgame.c 總結 💻作 者 簡 介:曾 與 你 一 樣 迷 茫,現 以 經 驗 助 你 入 門 C 語 言 💡個 人 主…

車載以太網網絡測試-21【傳輸層-DOIP協議-4】

目錄 1 摘要2 DoIP entity status request/response(0x4001、0x4002)2.1 使用場景2.2 報文結構2.2.1 0x4001:DoIP entity status request2.2.2 0x4002:DoIP entity status response 3 Diagnostic power mode information request/…

CH347使用筆記:CH347結合STM32CubeIDE實現單片機下載與調試

目錄 基于 STM32CubeIDE的 CH347 JTAG/SWD調試器使用說明1. CH347驅動安裝與配置2. STM32CubeIDE調試器配置2.1 打開相關工程后,進行以下操作2.2 openocd.exe替換2.3 腳本添加2.4 更改調試器選擇 3. 下載程序4. 使用過程中可能遇到的問題4.1 CH347未插入4.2 Openocd…

LVGL常用功能備忘

概述 本文選用LVGL 8.3版本 8.3版本實測幀率比起9版本高,多個GUI工具支持 相關鏈接 LVGL官網 https://lvgl.io/ LVGL 文檔 https://docs.lvgl.io/8.3/ LVGL倉庫 https://github.com/lvgl LVGL移植 獲取源碼 https://github.com/lvgl/lvgl/tree/release/v8.3 下載文件即可 文件…

k8s搭建kube-prometheus

后續再補一個k8s集群搭建的博客,從0開始搭建k8s集群。使用kube-prometheus非常方便,主要問題只在于拉取鏡像。除了拉取鏡像外其他時間5分鐘即可。耐心等待拉取鏡像。 一.kube-prometheus簡介 kube-prometheus 是一個專為 Kubernetes 設計的開源監控解決…

uni-app——數據緩存API

數據緩存API 在 uni-app 開發中,數據緩存 API 起著重要作用,它能夠將需要的數據保存到本地,同時也提供了獲取本地緩存數據、移除緩存數據以及清理緩存數據的功能。在實際項目里,數據緩存 API 常被用于存儲會員登錄狀態信息、購物…

突破時空邊界:Java實時流處理中窗口操作與時間語義的深度重構

一、流處理范式的革命性演進 在數字化浪潮的推動下,數據處理范式正經歷著從批量到實時的根本性轉變。這種轉變不僅改變了數據處理的時效性特征,更重新定義了時間維度在計算模型中的戰略地位。Apache Flink的統計數據顯示,現代流處理系統每秒…

【2025 深圳大學-騰訊云程序設計競賽(熱身賽)】題解

比賽鏈接 A. Cloud Studio的共享連接 題目大意 && Solution 給定 T T T 組長度均為 12 12 12 的字符串 s s s。 對每個 s s s,將其按從左到右的順序兩兩分組形成 6 6 6 個 A S C I I \rm{ASCII} ASCII 碼,對這 6 6 6 個 A S C I I \…

APScheduler - 用戶指南

本文翻譯整理自:https://apscheduler.readthedocs.io/en/3.x/userguide.html 文章目錄 一、安裝 APScheduler二、代碼示例三、基本概念四、選擇合適的 scheduler, job store(s), executor(s) and trigger(s)五、配置調度器方法 1:方法 2:方法 3: 六、啟動調度器七、…

vue3:十一、主頁面布局(優化頁面跳轉方式)

:router"true" 一、參考文章 vue3:十一、主頁面布局(實現基本左側菜單右側內容效果)-CSDN博客 參考上述文章可知,頁面跳轉是通過在js中定義的菜單中攜帶的path,然后通過菜單的點擊事件完成的跳轉,現在可以進行優化,直…