[學習記錄]Unity-Shader-幾何著色器

????????幾何著色器是可編程渲染管線中的一個可選階段,位于頂點著色器之后和片段著色器之前。其核心能力在于動態生成和操作幾何體圖元。

一.圖元

????????了解圖元是理解幾何著色器的基礎和前提,因為幾何著色器的工作就是接收圖元,然后輸出圖元

幾何著色器是以圖元為單位工作的:

輸入是圖元: 幾何著色器不像頂點著色器那樣單獨處理每個頂點。它的輸入是一個完整的圖元。這意味著它一次性接收構成一個點、一條線或一個三角形的所有頂點數據。例如,當它接收一個三角形時,它會同時獲得這個三角形的三個頂點及其所有屬性。

輸出是圖元: 同樣地,幾何著色器的輸出也不是孤立的頂點,而是組織成完整圖元(點、線或三角形)的頂點流。

1.什么是圖元?

在計算機圖形學中,圖元是構成任何 3D 幾何體的最基本構建塊。 它們是圖形硬件能夠直接理解和渲染的最小單位。

主要的三種基本圖元類型是:

點 (Points): 最簡單的圖元,由一個頂點定義。它沒有面積或體積,只代表一個空間位置。

線 (Lines): 由兩個頂點定義,連接這兩個頂點形成一條線段。它只有長度,沒有面積或體積。

三角形 (Triangles): 由三個頂點定義,這三個頂點構成一個平面多邊形。

2.圖元拓撲類型

在應用階段,CPU需要向GPU提交一系列數據和命令供其渲染。
????????應用階段最重要的任務是輸入裝配(input assembler)。輸入裝配階段會從顯存中讀取幾何數據(頂點和索引),再將它裝配為幾何圖元(geometry primitive)
????????可是,單憑頂點和索引數據,GPU無法知道頂點究竟如何組成幾何圖元。例如,我們應將頂點2個一組解釋成線段,還是3個一組解釋為三角形呢?對此,我們需要通過指定圖元拓撲(primitive topology)?來告訴GPU如何利用頂點數據來表示幾何圖元。

在DirectX中,基礎圖元拓撲類型有以下五種:點列表(point list)線條帶(line strip)線列表(line list)三角形帶(triangle strip)三角形列表(triangle list)

? ? ??

3.圖元與拓撲的關系

拓撲 (Topology) 是指幾何對象的連接性 (Connectivity)結構關系,它描述了點、邊、面之間是如何相互連接的,而不關注它們在空間中的具體位置或形狀。

圖元就是拓撲的基本表現形式:

頂點是拓撲的基本元素: 它們是構建所有圖元的基礎。

圖元類型定義了局部拓撲:

點圖元: 拓撲上是孤立的頂點。線圖元: 拓撲上是兩個頂點通過一條邊相連。三角形圖元: 拓撲上是三個頂點通過三條邊相連,形成一個面。

多個圖元組合形成復雜拓撲

二.幾何著色器是什么

????????幾何著色器是可編程渲染管線中的一個可選階段,位于頂點著色器之后和片段著色器之前。其核心能力在于動態生成和操作幾何體圖元。特點如下:

1.接收一個完整的圖元(Primitive)作為輸入: 它可以是點、線或三角形。

2.動態生成新的圖元: 根據輸入,它可以決定輸出零個、一個或多個新的點、線或三角形。

3.修改圖元類型: 例如,將一個點擴展成一個四邊形(公告板),或者將一個線段擴展成一個帶狀物體。

幾何著色器位于幾何處理階段的可選頂點處理階段。

三.幾何著色器的核心概念

幾何著色器的一般格式:

[maxvertexcount(N)]
void geom(triangle Attributes input[3], inout TriangleStream<Varyings> stream)
{}

1.最大頂點數量

????????[maxvertexcount(N)] 用來指定幾何著色器單詞調用所輸出的頂點數量最大值。其中,N是幾何著色器單次調用所輸出的頂點數量最大值。幾何著色器每次輸出的頂點個數都可能不同,但是這個數量卻不能超過之前定義的最大值。
????????出于對性能方面的考慮,我們應當令maxvertexcount的值盡可能小。線管資料顯示,GS每次輸出的標量數量在1-20時,它將發揮出最佳的性能;而當27-40時,它的性能將下降到峰值性能的50%。

2.輸入圖元

幾何著色器最根本的特點是它處理的單位是完整的圖元。

頂點著色器中的輸出結構需要與幾何著色器的輸入結構對應一致

你的頂點著色器中返回的是什么類型,幾何著色器的輸入結構就是什么類型。

1.HLSL語法定義

point YourAttributesStruct input[1]
line YourAttributesStruct input[2]
triangle YourAttributesStruct input[3]

通過幾何著色器函數的第一個參數來指定輸入的圖元類型。

2.輸入圖元類型

(1)點 (Point)

由一個頂點構成。

HLSL 定義:point InputStruct input[1] ,input[1]表示一個包含單個元素的數組。

input[0]即可訪問該點的頂點數據。

何時使用: 當你希望將模型中的離散點(例如粒子系統的粒子、點云數據、骨骼關節)擴展成更復雜的幾何體時(例如,將點變成公告板四邊形)。

(2)線 (Line)

由兩個頂點構成,連接形成一條線段。

HLSL 定義: line?InputStruct input[2]

input[0] 和input[1]分別訪問線段的起始點和結束點的頂點數據。

何時使用: 當你希望將模型中的線段(例如,線框模型、角色骨骼連接線、某些頭發渲染中的發束)加粗、變成帶狀幾何體或在其上生成其他結構時。

(3)三角形 (Triangle)

由三個頂點構成,形成一個平面。

HLSL 定義: triangle?InputStruct input[3]

input[0],input[1],input[2] 分別訪問三角形的三個頂點的頂點數據。

何時使用: 這是最常見的輸入類型,當你希望從網格的面(例如,頭皮表面、地形面)生成額外的幾何體時(如?Fin Fur 毛發、草地、樹葉等)。

3.輸出圖元流

????????幾何著色器不像頂點著色器那樣直接return一個頂點,它通過向一個輸出流 (Stream) 中Append?頂點來構建新的圖元。這個流會累積你生成并追加(Append)入流的頂點,并根據流的類型自動將它們組織成圖元。

????????這里OutputStruct必須是幾何著色器傳遞給片段著色器的數據結構。它至少需要包含SV_POSITION語義的裁剪空間位置。

1.HLSL語法定義

inout PointStream<YourOutputStruct> stream
inout LineStream<YourOutputStruct> stream
inout TriangleStream<YourOutputStruct> stream

????????在HLSL中,幾何著色器函數的第二個參數是標有inout修飾符的流類型(stream type)?。流類型存有一系列頂點,它們定義了幾何著色器輸出的幾何圖形。
流類型的本質是一種模板類型(template type),其模板參數用以指定輸出頂點的具體類型。

2.輸出圖元流類型

(1)PointStream<OutputStruct>

功能: 每次調用Apped()都會向流中添加一個頂點,并將其作為獨立的點圖元輸出。

何時使用: 當希望從輸入的幾何體中提取或生成離散的點時。

(2)LineStream<OutputStruct>

功能: 每兩次調用Append()會創建一個新的線段圖元。如果連續Append多個頂點,它們將形成一個線段條帶 (Line Strip),每條新線段都會重用前一條線段的最后一個頂點。

何時使用: 當你希望從輸入的幾何體中生成線段、輪廓線或細長的帶狀物時。

示例:stream.Append(v3):?輸出線段 (v2, v3)。

(3)TriangleStream<OutputStruct>

功能: 每三次調用Append()會創建一個新的三角形圖元。如果連續Append多個頂點,它們將形成一個三角形條帶 (Triangle Strip),這意味著每個新三角形都會重用前兩個三角形的頂點。

何時使用: 這是最常用的輸出類型,當你希望從輸入的圖元中生成面片(例如毛發、草葉、將點轉換為四邊形)。

4.關鍵函數

(1)stream.Append(OutputStruct vertexData)

作用: 將幾何著色器的輸出數據追加到一個現有的圖元流中。

參數: 接受一個OutputStruct類型的數據,其中包含了新生成頂點在裁剪空間的位置 (SV_POSITION),以及該頂點需要傳遞給片段著色器的所有其他屬性(如 UV、法線、顏色等)。

工作機制: GPU 會將這個頂點數據暫存起來,直到湊夠構成一個完整圖元所需的頂點數量(例如,對于TriangleStream需要三個頂點)。一旦湊夠,該圖元就會被發送到渲染管線的下一個階段(光柵化器)。

消耗預算: 每次調用Append()都會消耗幾何著色器[maxvertexcount(N)]?預算中的一個頂點。

(2)stream.ResatrtStrip()

作用: 僅用于LineStream和TriangleStream,強制結束當前的基元條帶,開始一個新的條帶。如果當前的條帶沒有足夠的頂點被追加出來以填滿基元拓撲結構,那么末端的不完整基元將被丟棄。

何時使用: 當你需要生成多個不連續的圖元時。

例如: 如果你輸入一個三角形,希望輸出三個獨立的四邊形(而不是一個由 12 個頂點組成的連續三角形條帶),那么在每生成一個四邊形所需的四個頂點后,就需要調用 stream.ResatrtStrip()。這樣下一個四邊形的頂點將從一個新的條帶開始,而不會與前一個四邊形連接。

工作機制: 告訴GPU已經完成了當前這個條帶的圖元,請準備好接收下一個完全獨立的圖元序列。

參考文章

1.(90 封私信 / 80 條消息) Unity幾何著色器詳解 - 知乎

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

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

相關文章

Paimon 布隆過濾器索引

布隆過濾器原理布隆過濾器的最優參數推導是其理論核心&#xff0c;理解了這個過程&#xff0c;就能明白 BloomFilter64 構造函數里計算公式的由來了。下面我們一步步來推導。首先&#xff0c;我們定義幾個關鍵變量&#xff1a;n: 預估要插入的元素數量 (對應代碼中的 items)。m…

Python-GUI-wxPython-布局

1 需求 2 接口 wx.Sizer().Add() proportion&#xff08;比例&#xff09;參數是一個整數&#xff0c;用于指定當父布局管理器的空間有剩余時&#xff0c;被添加的對象&#xff08;這里是 general_sizer 及其包含的組件&#xff09;在布局方向上可以占據的額外空間的比例。 當…

springboot 鏈路追蹤實現

traceid實現 需要依賴<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.5</version></dependency>public class TraceIdContext {private static final String …

JavaEE初階第七期:解鎖多線程,從 “單車道” 到 “高速公路” 的編程升級(五)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 一、死鎖 1.1. 死鎖的概念 死鎖是指兩個或多個并發進程&#xff08;或線程&#xff09;在執行過程中&#xff0c;因爭奪資源而造成的一種互相等待的現象。如果沒有外力作用&#xff0c;這些進程將永遠無法繼…

黑暗中的爆破(船訊網Ais爬蟲暨爬蟲實戰js逆向學習經驗分享)

事先聲明:本文章所獲得的信息均通過合法手段獲得(本人為政府部門工作,爬蟲行為均經過授權),爬蟲需遵守各項法律法規,不該爬取的信息不爬。 最近因為做博士畢業設計需要用到ais信息,但在船訊網爬取ais的時候遇到了問題,因為之前爬取的人太多,所以網站加上了反爬措施,c…

代碼混淆的步驟

在 Android 開發中&#xff0c;代碼混淆&#xff08;ProGuard/R8&#xff09;是保護代碼安全和縮減應用體積的關鍵步驟。以下是詳細的混淆流程和優化策略&#xff1a; 一、基礎混淆步驟 1. 啟用混淆 在 build.gradle 中配置&#xff1a; android {buildTypes {release {mini…

分布式集合通信--學習筆記

分布式集合通信一 基礎概念 分布式系統模型 節點與進程模型 多機多卡、多機多進程通信模式 同步 、異步 集合通信定義 點對點通信 vs 集合通信 點對點通信 定義 &#xff1a;兩個節點之間的直接數據傳輸&#xff0c;通常基于專用鏈路或網絡路徑通信范圍&#xff1a;僅涉及兩…

工業顯示器五大品牌推薦及分析

在智能制造與工業自動化中&#xff0c;工業顯示器扮演著至關重要的角色&#xff0c;最近好多朋友問我有沒有什么賣工業顯示的廠家推薦。那今天我為大家整理了5個工業顯示器廠家品牌推薦&#xff0c;希望可以幫助您挑選到合適的工業顯示器一、佳維視&#xff08;JAWEST&#xff…

ComfyUI工作流:一鍵換背景體驗不同場景

換背景效果展示 在圖像編輯領域&#xff0c;背景替換是提升作品視覺效果與創意表達的重要手段。魔多 AI 社區推出的 “一鍵換背景” ComfyUI 工作流&#xff0c;憑借先進的 AI 技術與極簡操作流程&#xff0c;為用戶提供了高效、精準的背景替換解決方案。本文將從技術原理、功能…

圖像旋轉:從原理到 OpenCV 實踐

在圖像處理領域&#xff0c;圖像旋轉是一項基礎且重要的操作。它不僅可以改變圖像的方向&#xff0c;還在許多計算機視覺任務中發揮著關鍵作用&#xff0c;比如目標檢測、圖像配準等。本文將深入探討圖像旋轉的原理&#xff0c;并結合 OpenCV 庫提供具體的實現代碼。 一、圖像…

微服務架構下的抉擇:Consul vs. Eureka,服務發現該如何選型?

微服務架構下的抉擇&#xff1a;Consul vs. Eureka&#xff0c;服務發現該如何選型&#xff1f; 引言 想象一下&#xff0c;我們正在構建一個大型電商平臺。在“雙十一”大促期間&#xff0c;流量洪峰涌入&#xff0c;訂單服務、商品服務、用戶服務等都需要彈性伸縮&#xff…

基于Java+SpringBoot的寵物愛心組織管理系統

源碼編號&#xff1a;S572 源碼名稱&#xff1a;基于SpringBoot的寵物愛心組織管理系統 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;15 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windo…

數字樣機:改寫衛星物聯網的研制范式

01. 衛星物聯網&#xff1a;技術邊界的自然延伸 隨著物聯網在城市、工業、農業等領域的廣泛部署&#xff0c;萬物互聯的愿景正在不斷逼近技術的邊界。尤其是在海洋、沙漠、高原、邊遠山區等傳統通信網絡難以覆蓋的區域&#xff0c;人們對無盲點物聯網連接的需求日益增強。這一…

springsecurity---使用流程、加密機制、自定義密碼匹配器、token字符串生成

目錄 權限控制 相關框架 SpringSecurity springsecurity使用流程 1、搭建環境實現默認用戶名和密碼登錄 2、使用數據庫表中定義好的用戶名和密碼訪問實現等值密碼匹配 1&#xff09;sql文件 2)搭建jdbc或者mybatis或者mybatis-plus環境 3&#xff09;配置mybatis-plus環…

在 Ubuntu 22.04 上使用 Minikube 部署 Go 應用到 Kubernetes

文章目錄 環境說明目標步驟與問題解決1. 構建 Go 應用和 Docker 鏡像問題 1&#xff1a;Go 依賴下載卡住問題 2&#xff1a;Docker 鏡像拉取失敗 2. 設置 Minikube 集群安裝 Minikube問題 3&#xff1a;Minikube 啟動失敗問題 4&#xff1a;Minikube 鏡像拉取失敗 3. 部署 Kube…

Android Studio-Git的使用指南

一、git的基本使用流程 git clone 克隆遠程資源到本地目錄&#xff0c;作為工作目錄&#xff1b;然后在本地的克隆目錄上添加或修改文件&#xff1b;如果遠程修改了&#xff0c;需要同步遠程的內容&#xff0c;直接git pull就可以更新本地的文件&#xff1b;本地在修改之后&…

【github】想fork的項目變為私有副本

在 GitHub 上&#xff0c;所有的 fork 都會繼承其上游倉庫&#xff08;upstream&#xff09;的可見性&#xff08;visibility&#xff09;設置&#xff1a; 可見性繼承 如果你 fork 的原倉庫是 public&#xff0c;那么你的 fork 也必須是 public。如果原倉庫是 private&#xf…

微軟發布新一代存儲優化型虛擬機:Azure Laosv4、Lasv4 和 Lsv4 系列

微軟宣布&#xff0c;全新一代存儲優化型虛擬機——Azure Laosv4、Lasv4 和 Lsv4 系列已正式面世。 與前一代虛擬機系列相比&#xff0c;全新的 L 系列虛擬機實現了重大突破。它支持高達 23TB 的本地 NVMe SSD&#xff0c;在 CPU、網絡以及遠程存儲性能方面均有顯著提升。該系…

python調用pybind11導出的pyd,出現UnicodeDecodeError

python調用pybind11導出的pyd&#xff0c;出現UnicodeDecodeError 1. 問題描述 舉個例子&#xff0c;當有以下C代碼以及Pybind11的綁定代碼時&#xff0c;在python訪問包含中文的Name和Value會有UnicodeDecodeError的異常&#xff01; class VxUserProp{public:VxUserProp();…

MySQL別名在GROUP BY中的使用規則

-- 設置變量&#xff1a;SET earliest_date ... 用于定義并賦值一個用戶變量 earliest_date。 -- 用戶定義的變量必須以 符號開頭&#xff0c;例如 earliest_date。 -- 符號是MySQL中用戶變量的標識符&#xff0c;用于區分系統變量和用戶變量。 SET earliest_date (SELECT …