第一天 UnityShader的結構

Shader初學者的學習筆記

第一天 Unity Shader的結構


文章目錄

  • Shader初學者的學習筆記
  • 前言
  • 一、Unity Shader結構
  • 二、Unity Shader結構解析
    • ① Properties
    • ② Tags
    • ③ RenderSetup(可選狀態)
    • ④ Name
    • ⑤ [Tags]
    • ⑥ [RenderSetup]
    • ⑦ 頂點著色器和片元著色器的代碼 (Unity最聰明的孩子)
    • ⑧ Fallback
  • 總結


前言

由于看完Unity Shader入門精要后發現自己看了就忘,于是想著寫博客來記錄一下入門精要這本書里面的我覺得需要記錄的內容,如果學的比較扎實的話,之后會對一些好的Shader進行學習,每天一篇


一、Unity Shader結構

Shader "Shader name"
{Properties{Name ("display name", propertyType) = DefaultValue				①}SubShader{[Tags][RenderSetUp]													③Pass{[Name][Tags][RenderType]//頂點著色器和片元著色器										⑦}}SubShader{...}FallBack "Diffuse"}

二、Unity Shader結構解析

① Properties

Properties語義塊中包含了一系列的屬性,這些屬性會出現在材質面板中;

Name ("display name", PropertyType) = DefaultValue
EX:
//單獨的數字
_Int ("Int", Int) = 2
_Float ("Float", Float) = 1.5
_Range ("Range", Range(1.0, 5.0)) = 3.0
//四維向量
_Color ("Color", Color) = (1, 1, 1, 1)
_Vector ("Vector", Vector) = (2, 3, 6, 1);
//Textures 紋理類型的屬性定義稍微復雜,默認值嘶通過一個字符串后跟一個花括號來指定的,字符串里面要么是空,要么是內置的紋理名稱:white, black
_2D ("2D", 2D) = "" {}
_Cube ("Cube", Cube) = "white" {}
_3D ("3D", 3D) = "black" {}

Name:如果我們需要在Shader中訪問這些屬性,就需要使用各個屬性的名字;
display name則是出現在材質面板上的名字
PropertyType指定了屬性的類型

② Tags

Tags {"TagName1" = "Value1", "TagName2" = "Value2"}
標簽類型說明
Queue控制渲染順序,指定該物體屬于哪個渲染隊列,通過這種方式可以保證所有的透明物體可以在所有不透明物體的后面被渲染
RenderType對著色器進行分類,例如這是一個不透明的著色器,或是一個透明的著色器,這可以被用于著色器替換功能
DisableBatching一些SubShader在使用Unity的批處理功能時會出現問題,例如使用了模型空間下的坐標進行頂點動畫,這是可以通過該標簽來直接指明是否對該SubSahder使用批處理
ForceNoShadowCastingCasting控制使用該SubShader的物體是否會投射陰影
IgnoreProjector如果該標簽為True,那么使用該SubShader的物體將不會受Projector的影響,通常用于半透明物體

注意:以上的這些標簽之恩在SubShader中聲明,但是不能在Pass中聲明

③ RenderSetup(可選狀態)

狀態名稱設置指令解釋
CullCull Back /Front/ OFF設置剔除模式;剔除背面/正面/關閉剔除
ZTestZTest Less Greater/ LEqual? GEqual / NotEqual/ Always設置深度測試時使用的函數
ZWriteZWrite On / Off開啟/ 關閉深度寫入
BlendBlend SrcFactor DscFactor開啟并設置混合模式

注意:如果在SubShader里面設置了渲染狀態后,將會應用到所有的Pass,如果我們不想這樣,可以在Pass語義塊中單獨進行上面的設置

④ Name

我們可以在Pass中單獨定義該Pass的名稱,通過這個名稱,我們可以使用UsePass命令來直接使用其他的Unity Shader中的Pass,但是需要注意的是:由于Unity內部會把所有的Pass的名稱轉化為大寫字母的表示.因此,使用UsePass命令時必須使用大寫形式的名字.

Ex:
UsePass "MyShader/MYPASSNAME

⑤ [Tags]

我們在上面說過,SubShader中的Tags與此處的標簽不同:此處的這些標簽也用于告訴渲染引擎我們希望怎樣渲染該物體

標簽類型說明
LightMode定義該Pass在Unity的渲染流水線中的角色
RquireOptions用于指定當滿足某些條件時才能渲染該Pass,它的值是一個用空格分隔的字符串

⑥ [RenderSetup]

我們在上面也說過,如果需要單獨設置每一個Pass的渲染狀態,就可以不用在SubShader中設置渲染狀態,例如:在進行雙面渲染時,我們希望在第一個Pass中剔除正面來對背面渲染,在第二個Pass中剔除背面來對正面進行渲染,這是就應該在Pass語義塊中進行單獨設置.因此這塊的狀態名稱與SubShader里面的狀態名稱是共用的.

⑦ 頂點著色器和片元著色器的代碼 (Unity最聰明的孩子)

在今天這一部分我們先不介紹頂點著色器和片元著色器,因為會在之后著重介紹,其實除了這兩個著色器之外,還有表面著色器等,由于我們在這本書中著重講的是頂點著色器和片元著色器,所以這塊就這樣寫.
頂點著色器要做的事情就是將在模型空間的頂點,先轉換到模型空間,在變換到觀察空間,經過裁剪空間的計算,對裁剪平面的圖元進行剔除,保留裁剪空間內的圖元.
一句話總結:
頂點著色器的最基本的任務就是把頂點坐標從模型空間轉換到裁剪空間中(逐頂點).
在片元著色器中,我們通常也可以得到該片元在屏幕空間的像素位置(逐片元).

⑧ Fallback

在每一個SubShader語義塊的后面,可以是一個Fallback命令,它用于告訴Unity,如果上面的所有SubShader在這塊顯卡上都不能運行,那么就用這個低級的shader吧!!!
事實上,Fallback還會影響陰影的投射,在渲染陰影紋理時,Unity會在每一個Unity Shader中尋找一個陰影投射的Pass,通常情況下,我們不需要自己專門實現一個Pass,這是因為Fallback使用的內置Shader中包含這樣一個通用的Shader,因此,為每一個Unity Shader正確設置Fallback是非常重要的.


總結

以上就是今天我總結的內容了,就是將Unity Shader的大致結構進行一個分析理解,方便之后對代碼的學習理解.

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

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

相關文章

VL開源模型實現文本生成圖片

一、 基礎知識 根據描述生成圖片的視覺-語言模型(Vision-Language Models, VL 模型)是近年來多模態生成領域的熱點研究方向。這些模型能夠根據自然語言描述生成高質量的圖像,廣泛應用于藝術創作、設計輔助、虛擬場景構建等領域。 1 根據描述…

【Java SE】抽象類/方法、模板設計模式

目錄 1.抽象類/方法 1.1 基本介紹 1.2 語法格式 1.3 使用細節 2. 模板設計模式(抽象類使用場景) 2.1 基本介紹 2.2 具體例子 1.抽象類/方法 1.1 基本介紹 ① 當父類的某些方法,需要聲明,但是又不確定如何實現時&#xff…

【人工智能】LM Studio 的 GPU 加速:釋放大模型推理潛能的極致優化

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的廣泛應用,其推理效率成為限制性能的關鍵瓶頸。LM Studio 作為一個輕量級機器學習框架,通過 GPU 加速顯著提升了大…

深度學習:從零開始的DeepSeek-R1-Distill有監督微調訓練實戰(SFT)

原文鏈接:從零開始的DeepSeek微調訓練實戰(SFT) 微調參考示例:由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

流暢如絲:利用requestAnimationFrame優化你的Web動畫體驗

requestAnimationFrame 是前端開發中用于優化動畫性能的 API。它允許瀏覽器在下一次重繪之前執行指定的回調函數,通常用于實現平滑的動畫效果。 1.作用 優化性能:requestAnimationFrame 會根據瀏覽器的刷新率(通常是 60Hz,即每秒…

【pytest框架源碼分析五】pytest插件的注冊流程

前文介紹到pytest整體是運用插件來實現其運行流程的。這里仔細介紹下具體過程。 首先進入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

問題 時序數據庫 IoTDB 1.3.3 版本 IoTDB 執行查詢操作失敗,日志打印提示 Too many open files。通過命令查看打開文件數,結果如下: [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk機器人告警

1、dingtalk創建機器人,目前我們采用加白名單的方式校驗 2、定位到如下圖 test結果如下

C 語 言 --- 操 作 符 2

C 語 言 --- 操 作 符 2 移 位 操 作 符定 義原 碼 補 碼 和 反 碼左 移&#xff08;<<&#xff09;右 移&#xff08;>>&#xff09;算 術 右 移邏 輯 右 移 按 位 與、按 位 或、和 按 位 異 或按 位 與按 位 或按 位 異 或 邏 輯 反 操 作負 值 操 作按 位 取 反…

基于Spring Boot的公司資產網站的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

零碳工廠能源管理系統的核心技術與應用實踐

零碳工廠能源管理系統是一種高效的解決方案&#xff0c;旨在優化能源使用并減少碳排放&#xff0c;以幫助工廠實現低碳或零碳的生產目標。以下是該系統的詳細構成和功能&#xff1a; 1. 核心組件 傳感器和監測設備&#xff1a;用于實時監測工廠內的能源使用情況&#xff0c;包…

美攝接入DeepSeek等大模型,用多模態融合重構視頻創作新邊界!

今年以來&#xff0c;DeepSeek憑借其強大的深度推理分析能力&#xff0c;在AI領域掀起新的熱潮。美攝科技快速響應市場需求&#xff0c;迅速接入以DeepSeek、通義千問、商湯、文心一言為代表的大模型&#xff0c;為企業視頻創作生產帶來全新體驗。 傳統視頻創作面臨著同質化、…

JAVA————十五萬字匯總

JAVA語言概述 JAVA語句結構 JAVA面向對象程序設計&#xff08;一&#xff09; JAVA面向對象程序設計&#xff08;二&#xff09; JAVA面向對象程序設計&#xff08;三&#xff09;工具類的實現 JAVA面向對象程序設計&#xff08;四&#xff09;錄入異常處理 JAVA圖形用戶界面設…

力扣熱題100(方便自己復習,自用)

力扣熱題100 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 查找兩數之和是不是等于target也就是我們找到一個數之后&#xff0c;用target將其減掉&#xff0c;再尋找應當對應的元素是什么每找到一個數&#xff0c;我們就將其放在集合中&#xff0c;因為集合中可以去重…

【yolo】yolo訓練報錯,以及解決方案

背景&#xff1a; 剛剛&#xff0c;寫了《【yolo】yolo推理報錯&#xff0c;以及解決方案》&#xff0c;馬上訓練就遇到類似的報錯。 我對我標注的圖像進行了300輪的訓練&#xff0c;但是訓練完300輪后&#xff0c;報錯了。。。 報錯信息 300 epochs completed in 0.085 hou…

vscode/cursor中python運行路徑設置 模塊導入問題

vscode/cursor中python運行路徑設置 ## 文件路徑設置 問題描述 pycharm的項目用cursor運行&#xff0c;出現目錄找不到 后來利用 os.getcwd()&#xff0c;經過打印調試發現是IDE的本身配置問題 pycharm中&#xff0c;os.getcwd()默認打開當前腳本所在目錄 vscode/cursor中…

理解線性動力學中的模態疊加法

線性動力學中的模態疊加方法 模態疊加法是線性動力學中一種有價值的工具&#xff0c;可以有效地確定頻域或時域中的系統響應。對于某些類型的線性動力學分析&#xff0c;有必要使用此方法&#xff0c;因此了解該過程對于獲得準確的結果至關重要。在本博客中&#xff0c;我們將…

報錯 - redis - Unit redis.service could not be found.

報錯&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解決方法&#xff1a; 檢查狀態、有必要的話 重新安裝 Linux 上查看狀態 systemctl status redis顯示以下內容&#xff0c;代表正常服務 出現下面…

CMS網站模板定制設計與安全評估

內容概要 現代CMS&#xff08;內容管理系統&#xff09;作為網站建設的核心載體&#xff0c;其模板架構與安全防護體系的協同設計已成為企業數字化轉型的關鍵環節。隨著網絡攻擊向量日益復雜化&#xff0c;基于HTTPS協議的端到端加密部署不僅成為基礎安全配置&#xff0c;更直…

【React】useEffect、useLayoutEffect底層機制

目錄 useEffect不設置依賴設置空數組&#xff0c;無依賴設置多個依賴返回值是一個函數總結useEffect的使用環境useEffect 中發送請求錯誤示例用.then獲取數據在useEffect創建一個函數 總結 useLayoutEffectuseLayoutEffect 和useEffect區別執行時機&#xff1a;瀏覽器渲染的關系…