Unity3D Shader 入門知識

Unity3D Shader 入門知識詳解。

Unity3D Shader 入門知識

Shader(著色器)對很多 Unity 初學者來說像是“黑魔法”。

實際上,Shader 并沒有那么神秘,它本質上就是一段運行在 GPU 上的小程序,用來控制 屏幕上每個像素的顏色和顯示效果

本文會寫一個最簡單的 Shader,并逐步講解 Shader 的基本結構。

什么是 Shader

在 Unity 中,Shader 是材質的核心,它告訴 GPU 如何去渲染一個物體。

我們平常看到的各種特效(發光、透明、水波、卡通描邊)都是 Shader 在發揮作用。

Unity 的 Shader 常見有三類:

  • Surface Shader:Unity 封裝的高層次寫法,適合快速實現光照材質。
  • Vertex/Fragment Shader:底層控制方式,可以完全自定義頂點和像素的渲染。
  • Shader Graph:可視化編輯,拖拽節點即可拼接 Shader。

本文我們先用 最簡單的 Unlit Shader(無光照)入門。

Shader 的基本結構

在 Unity 中,一個最基礎的 Shader 結構長這樣:

Shader "Custom/SimpleColor"
{Properties{_Color ("Main Color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"fixed4 _Color;struct appdata{float4 vertex : POSITION;};struct v2f{float4 pos : SV_POSITION;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{return _Color;}ENDCG}}
}

代碼解讀

命名

Shader "Custom/SimpleColor"

每個 Shader 都需要一個唯一的名字,格式通常是 Shader "路徑/名字"

這里并不是文件路徑,而是 Unity 內部的命名空間

在材質球 (Material) 的 Shader 下拉菜單 里,這個名字會決定 Shader 的顯示位置。

Properties 塊

Properties
{_Color ("Main Color", Color) = (1,1,1,1)
}

這里定義了材質面板中可調的屬性。

  • _Color:變量名(在 Shader 代碼里使用)
  • "Main Color":在 Inspector 面板顯示的名字
  • Color:屬性類型
  • (1,1,1,1):默認值(RGBA = 白色)

SubShader 與 Pass

  • SubShader:真正的渲染邏輯寫在這里。Unity 會根據顯卡選擇合適的 SubShader。
  • Pass:一次渲染指令。復雜 Shader 可能包含多個 Pass,比如一次渲染邊緣,一次渲染本體。

Tags

Tags { "RenderType"="Opaque" }

它是一個 鍵值對 集合,用來告訴 Unity 的渲染管線,這個 Shader 應該被如何分類、排序和處理

"RenderType" 是 Unity 內置的一個 Shader Tag,用于描述 材質的大類渲染方式

常見取值有:

  • "Opaque"不透明物體(默認)
  • "Transparent"透明物體(如玻璃、粒子、UI)
  • "TransparentCutout"透明裁剪物體(如樹葉、圍欄,透明部分直接裁掉,沒有半透明)

這里使用 "Opaque",Unity 會把它放到 不透明隊列(Queue = Geometry, 2000 左右) 里進行渲染。

CGPROGRAM 塊

這是 HLSL/CG 代碼的區域,包裹在 CGPROGRAM 和 ENDCG 之間。

  • #pragma vertex vert:指定頂點著色器函數(vert)
  • #pragma fragment frag:指定片元著色器函數(frag)
  • #include "UnityCG.cginc":引入 Unity 提供的一個 HLSL 公共函數/宏庫,相當于 C# 里的 using,例如下面用到的 UnityObjectToClipPos 就是這個庫里的函數,把 模型空間 轉換成 裁剪空間,幾乎每個 Shader 頂點著色器都要用到。
fixed4 _Color;

在代碼區域定義的 _Color 變量,使用的是 Properties 定義的 _Color 屬性,名稱要一致才能獲取到。

頂點數據 appdata

struct appdata
{float4 vertex : POSITION;
};

appdata 是一個 輸入結構體,表示從 CPU → GPU 傳遞過來的信息(網格頂點數據),是 GPU 渲染管線的入口數據

這里的 語義標識符: POSITION)告訴 GPU,vertex 對應的是頂點坐標。

Mesh 的每個頂點都會生成一個 appdata,送入頂點著色器。

頂點著色器 vert

struct v2f
{float4 pos : SV_POSITION;
};v2f vert (appdata v)
{v2f o;o.pos = UnityObjectToClipPos(v.vertex);return o;
}
  • 輸入 appdata:包含了模型的頂點數據(位置、法線、UV 等)。
  • UnityObjectToClipPos:把模型空間的坐標轉換到屏幕空間(必須操作)。
  • 輸出 v2f:傳遞給片元著色器的數據(同 appdata,是一個結構體)。

片元著色器 frag

fixed4 frag (v2f i) : SV_Target
{return _Color;
}
  • frag 決定屏幕上這個像素最終是什么顏色。
  • 這里直接返回 _Color,所以整個模型就是一塊純色。

在 Unity 中測試

新建一個 Shader 文件,命名為 SimpleColor,粘貼上面的代碼。

創建Shader

新建一個 材質(Material),把 Shader 設置為 Custom/SimpleColor

創建材質

設置Shader

創建一個 Cube,把材質拖到 Cube 上。

拖動材質

在 Inspector 面板調整 Main Color,模型就會變成對應的顏色。

調整顏色

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

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

相關文章

【面試之Redis篇】主從復制原理

從面試的角度來解釋 Redis 主從復制原理,按照“總-分-總”的結構,清晰地闡述其核心概念、工作流程和關鍵要點,這能體現出你不僅知道是什么,還理解為什么以及如何應對相關問題。總覽:一句話定義 面試官您好,…

數據庫開啟ssl

數據庫:阿里云rds 系統:centos 需要修改的:nacos連接項目連接本地navicat連接 重點:為了兼容本地和服務器,ssl證書路徑由原來的絕對路徑換成環境變量參數,所以有步驟4 文章目錄步驟1 阿里云步驟2 navicat…

Redis 事件驅動與多路復用源碼剖析

Redis 事件驅動與多路復用源碼剖析1. 前言 Redis 是 單線程 I/O 多路復用 的典型代表。 它并不是多線程處理請求,而是依賴 事件驅動(event-driven)模型,在一個線程內高效管理海量連接。 核心組件: ae.c:事…

VR煤礦實訓系統相較于傳統煤礦培訓方式的獨特優勢?-廣州華銳互動

高度逼真,沉浸體驗?VR煤礦實訓系統運用先進的3D建模、動態仿真技術,對煤礦井下的復雜環境進行1:1還原。從幽深的巷道、運轉的采煤設備,到潮濕的空氣、昏暗的燈光,甚至細微的煤塵顆粒,都能逼真呈現。使用者戴上VR設備后…

javaweb XML DOM4J

XMLXML作用就是配置文件,properties使用不了較復雜的需求,xml應運而生配置文件對比 xml更方便tips1:新建resources目錄,并將src中的jdbc.properties移到resourcs中,并且右鍵標記為源代碼根目錄,這樣運行src時就會和pro…

多模態視頻理解領域 Benchmark 與 Leaderboard 整理

多模態視頻理解是當前人工智能領域的研究熱點,其核心目標是讓模型像人類一樣,綜合視頻中的視覺、聽覺(部分場景)及文本信息,實現對視頻內容的深度感知、理解與推理。為客觀評估模型性能,行業內涌現了眾多權…

18j621-3通風天窗圖集pdf(免費高清版)

18j621-3通風天窗已經替代05j621-3通風天窗圖集成為目前比較通用的建筑屋頂通風選型重要參考標準,18j621-3圖集是對前圖集的優化和革新,在18j621-3圖集中新增了TC8圓拱型電動采光天窗,豐富了屋面通風排煙設備的選型。在18j621-3天窗圖集中&am…

LawGPT:基于中文法律知識的大模型

本文轉載自:https://www.hello123.com/lawgpt ** 一、?? LawGPT:中文法律界的 “AI 法助”,啃透了 15 萬份判決書! LawGPT 是一系列專攻中文法律知識的開源大模型,在通用中文基座(如 ChatGLM&#xff0…

用 go-commons 快速寫一個監控 CPU/內存的 Exporter

歡迎加入開源項目,提你的 mr Go Commons:Golang 開發者的常用工具集,一站式解決常見需求 在 Go 語言的開發過程中,你是不是經常遇到這樣的情況: 想要做點小功能,卻得從零寫起,或者到處找三方…

KingbaseES客戶端工具Ksql使用全指南:從安裝到高級操作

引言 在國產數據庫蓬勃發展的今天,KingbaseES憑借其自主可控、高性能、高可用的特性,已成為政務、金融、能源等關鍵領域的首選數據庫。而作為其配套的命令行工具,Ksql更是DBA和開發人員的“瑞士軍刀”——它不僅能高效執行SQL查詢&#xff0c…

【LeetCode - 每日1題】可以輸入的最大單詞數

?? 個人主頁:(時光煮雨) ?? 高質量專欄:vulnhub靶機滲透測試 ?? 希望得到您的訂閱和支持~ ?? 創作高質量博文(平均質量分95+),分享更多關于網絡安全、Python領域的優質內容!(希望得到您的關注~) ??目錄?? 難度 ?? 題目回顧 ?解題思路 ??概述 ??核心…

3227. 字符串元音游戲

3227. 字符串元音游戲 題目鏈接:3227. 字符串元音游戲 代碼如下: class Solution { public:bool doesAliceWin(string s) {return ranges::any_of(s, [](char c) {return c a || c e || c i || c o || c u;});} };

微信小程序坐標位置使用整理(四)map組件

一、地圖上標點&#xff0c;marker 1.wxml <map id"map" scale"9" class"map"markers"{{markers}}" longitude"{{longitude}}" latitude"{{latitude}}" show-location"{{true}}"><cover-vie…

Parlant框架深度技術解析:革命性AI代理行為建模引擎

引言 在人工智能快速發展的今天&#xff0c;AI代理&#xff08;Agent&#xff09;技術已經成為連接人工智能與實際應用場景的重要橋梁。然而&#xff0c;傳統的AI代理開發面臨著諸多挑戰&#xff1a;提示詞工程的復雜性、行為不可預測性、工具調用的不確定性等問題嚴重制約了AI…

AI重構車載測試:從人工到智能的跨越

目錄 一、AI 在車載測試中的核心價值 二、AI 在車載測試的具體應用場景 (一)自動駕駛測試:AI 解決 “場景覆蓋” 與 “決策可靠性” 難題 (二)車機系統測試:AI 優化 “交互體驗” 與 “功能穩定性” (三)車載硬件測試:AI 實現 “故障預測” 與 “精準校準” (四)功能…

從職責劃分看架構:MVC 的 Controller 與 MVVM 的 ViewModel 差異

深入淺出&#xff1a;前端MVC與MVVM架構模式&#xff0c;你真的懂了嗎&#xff1f;? 序言 各位前端的“程序猿”和“程序媛”們&#xff0c;大家好&#xff01;&#x1f44b; 在前端開發的江湖中&#xff0c;MVC和MVVM這兩個詞&#xff0c;就像武林秘籍一樣&#xff0c;常常被…

Vue-color:Vue.js 專業顏色選擇器組件庫 – 支持Vue2/3,TypeScript,暗色主題

簡介 Vue-color 是一個專為 Vue.js 設計的顏色選擇器組件庫&#xff0c;提供了多種風格的顏色選擇器組件。它支持 Vue 2.7 和 Vue 3&#xff0c;具有 TypeScript 支持、SSR 兼容性和暗色主題支持。 特性 多種顏色選擇器 – 提供 Chrome、Sketch、Photoshop 等多種風格Vue 2.…

ArcGIS定向影像(2)——非傳統影像輕量級解決方案

ArcGIS能讓用戶自己低成本的做出谷歌街景嗎&#xff1f;現在ArcGIS Pro 3.2 和 ArcGIS Enterprise 11.2 能夠讓用戶不使用任何插件和擴展的情況下完成街景數據集的構建&#xff0c;數據管理&#xff0c;發布服務和調用的完整解決方案。非常體系化&#xff0c;由底層數據驅動&am…

CKA05--service

Task 重新配置 spline-reticulator namespace 中現有的 front-end Deployment&#xff0c;以公開現有容器 nginx 的端口 80/tcp 創建一個名為 front-end-svc 的新 Service &#xff0c;以公開容器端口 80/tcp 配置新的 Service &#xff0c;以通過 NodePort 公開各個 Pod 解析&…

用 Go 采集服務器資源指標:從原理到實踐

在后端開發或運維工作中&#xff0c;采集服務器資源指標 是個繞不開的需求&#xff1a; 運維要看 CPU、內存、磁盤的使用情況監控系統要定期上報這些數據應用程序有時候也需要根據系統負載做限流、彈性伸縮 那么問題來了&#xff1a;用 Go 怎么優雅地采集這些指標呢&#xff…