Cocos Creator Shader入門實戰(三):CCEffect參數配置講解

引擎版本:3.8.5

您好,我是鶴九日!



回顧


稍微回顧下前面兩篇博客講解的內容:

一、Cocos渲染效果的實現需要Material材質和Effect資源的互相配合。

二、Effect資源負責Shader片段的編寫和屬性配置,Material材質負責對Effect資源的包裝和可視化調整。

三、官方引擎使用的是OpenGL ES渲染,語言是類C語言的GLSL。

四、在可編程渲染管線中用戶只需關注頂點著色器和片段著色器的編寫,頂點著色器用于坐標轉換,片段著色器用于著色。

學習Shader,我們需要做到:遵循引擎設定規則,按照官方要求規范,才能更好的理解、使用Shader。



簡介


上篇文章中,我們介紹了下OpenGL的渲染流程和GLSL的一些語法,主要為了能夠理解著色器的一些流程原理。

但是這些內容,在引擎的設定規則中:Shader著色器代碼相關,僅屬于Effect資源配置的一部分。

Effect資源,結構主要有兩部分:

一、借助 GLSL 類C語言,實現頂點、片段著色器的部分代碼編寫,通過CCProgram來配置。

二、借助 YAML 類Json語言,聲明的渲染流程的一些屬性參數,通過CCEffect來配置。

兩部分內容互相補充,才能共同構建一個完整的渲染流程描述,這樣的描述才能被Material材質資源使用。

Effect資源的大概結構如下:

CCEffect %{// 渲染技術、過程、狀態、材質和屬性參數的配置
}CCProgram sprite-vs %{// 頂點著色器的片段代碼
}%CCProgram sprite-fs %{// 片段著色器的片段代碼
}%
  • CCEffect %{}% 實現渲染參數配置相關
  • CCProgram %{}% 實現著色器片段代碼邏輯

今天的內容,講解關于Effect資源下的流程配置參數,即CCEffect

理解了它,再結合著色器片段代碼,我們便理解:Material材質對Effect包裝后,通過屬性檢查器的一些屬性展示,以及后續如何通過代碼來配置自定義的屬性參數。

注:能力有限,理解可能有誤,期待您的諒解,并歡迎您的指出,感謝。



YAML


CCEffect的配置是通過YAML實現的,它是一種數據序列化格式,主要用于配置文件、數據交換等。

特點:簡潔易讀、層次結構清晰,支持多種數據類型,兼容性強,可轉換為Json、XML、CSV等。

剛開始學習的階段,YAML語言看似對初學者是不友好的。

還好,官方的引擎采用的是YAML 1.2標準的解析器,我們也能使用JSON進行配置,只是JSON的配置難免會繁瑣些。

builtin-sprite.effect為例,看下官方內置的Effect屬性配置。

路徑:../internal/effects/builtin-sprite.effect

CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: trueblendSrc: src_alphablendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpharasterizerState:cullMode: noneproperties:alphaThreshold: { value: 0.5 }
}%

將它轉換為Json內容:
請添加圖片描述
這樣的對比,是否能看清晰的看到YAML和JSON的區別呢。工具相關

https://www.lddgo.net/convert/yaml-to-json : 沒有廣告,但不支持XML、CSV的轉換

https://codebeautify.org/yaml-to-json-xml-csv:功能強大,但有廣告


特性

YAML語言,真正的強大不是簡潔,而是是引用繼承

先以官方文檔的示例演示下:

  • 引用的主要結構是: &name*name
    請添加圖片描述

  • 繼承的主要結構是:&name<<: *name
    請添加圖片描述

再以builtin-unit.effect的部分配置為例:

路徑:../internal/effects/builtin-unit.effect
請添加圖片描述

注: 右側便是最下面引用的數據字段

引用和繼承,這兩個特性是可以實現對配置的復用的。


語法

YAML的語法,沒有想象中的那么難,只是新的東西,恐懼讓我們畏難而已。

注意:千萬不要將CCEffect的參數設置認定為語法的組成部分,我當時就是這么想的,愁壞我了…

語法相關,主要內容相關如下:

一、行首的空格代表數據的層級

二、所有的引號、逗號都可以省略,但空格和冒號不可省略

三、以減號加空格開頭的,表示數組元素

四、引用的主要結構是: &name*name

五、繼承的主要結構是:&name<<: *name

這就夠用了。



屬性結構


YAML語法的使用,主要是用于配置渲染的屬性參數,這些參數類型可以這樣劃分:

一、以techniques命名的渲染技術, CocosShader定義的重要概念

二、以passes命名的渲染過程, CocosShader定義的重要概念

每個渲染過程 pass 主要包括的參數有:

  1. 必備參數:頂點、片段著色器的名字配置

  2. 可選參數:著色器不同狀態的設置,比如深度、模板、混合模式、光柵化等

  3. 可選參數:自定義屬性參數的配置,主要用于uniform或材質中屬性的調整

簡單的理解:渲染技術用于實現不同的渲染模式,渲染過程用于配置不同渲染模式下的參數和屬性。

渲染技術可定義多個,每個渲染技術可包含多個渲染過程,每個渲染過程必須帶有頂點和片段著色器的配置。

這就是YAML配置下的整體CCEffect的結構。

bultin-sprite.effect為例, 配置屬性如下:

注:如果渲染技術只有一個,name名字可忽略

CCEffect %{# 聲明渲染技術techniques:# 聲明渲染流程- passes:# 聲明頂點、片段著色器名和入口名  - vert: sprite-vs:vertfrag: sprite-fs:frag# 設置深度、模板測試的狀態depthStencilState:depthTest: falsedepthWrite: false# 設置混合模式blendState:targets:- blend: trueblendSrc: src_alphablendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpha# 設置光柵化狀態rasterizerState:cullMode: none# 自定義屬性properties:alphaThreshold: { value: 0.5 }
}%

注:在學習2D shader的過程中,此屬性結構除了properties自定義屬性外,大多為通用性配置。

接下來,我們簡要說明下每塊的屬性相關。

渲染技術(Technique)

渲染技術是Cocos Shader定義的一個重要概念,用于描述渲染過程(pass)的整體結構和配置。

多個渲染技術存在的情況下,每個渲染技術都必須特定的名稱(name),用于標記渲染技術的用途,CCEffect配置支持定義多個,但實際的應用只能有一個。

Cocos引擎,這樣的設計目的可能是:

一、通過定義多個不同技術,用于實現不同的渲染模式。就如builtin-unlit.effect 中包含四種技術:

  • opaque 用于渲染不透明物體
  • transparent 用于渲染半透明物體
  • add 采用加法混合模式,渲染半透明物體
  • alpha-blend 采用透明混合模式,渲染半透明物體

二、滿足不同場景的需求,優化性能,避免不必要的計算和渲染開銷。

三、作為跨平臺引擎,用于滿足不同平臺的特性

在Material材質的屬性檢查器中,通過Technique 便可選擇不同類型的渲染技術。
請添加圖片描述

渲染過程(Pass)

它同樣是Cocos Shader定義的一個重要概念,它主要用于定義和配置對象的渲染狀態和屬性。

每一個Pass都是一個獨立的渲染指令集合,在每個渲染技術(technique)中,可包含多個。

每個渲染過程(pass)都必須配置vertfrag的名字和入口參數,其它都是可選。

注:名字和入口,可以是文件中CCProgram聲明的,也可以是引擎提供的標準頭文件相關

比如:我們創建的無光照effect文件,它的頂點著色器就是引用的引擎提供的:

techniques:- name: opaquepasses:# 引擎提供的通用性片段相關,在引擎中這些封裝被稱為Chunks- vert: legacy/main-functions/general-vs:vert # builtin header]# Effect資源配置文件下的內部定義frag: unlit-fs:frag...

注:自定義的著色器入口名不要使用main,因為引擎編譯的時候會自動添加main作為渲染的入口

在CocosShader的渲染中,渲染過程是按照順序依次執行的,組合起來便是復雜的渲染效果。

builtin-unlit.effect的opaque渲染技術為例:
請添加圖片描述

  • Pass 0: 基礎渲染,用于渲染不透明物體的主體部分
  • Pass 1: 平面陰影渲染,用于在場景中添加簡單的陰影效果。
  • Pass 2: 延遲前向渲染

渲染管線狀態

渲染過程(pass)中配置一些參數,比如:光柵化、混合模式、深度和模版測試等,這些又被官方稱為PipelineStates

更多的參數說明可參考官方文檔:PipelineStates

這里簡單羅列三個:

一、DepthStencilState 光柵化時的可選渲染狀態

二、RasterizerState 深度和模板緩存的測試與狀態

三、BlendState 材質混合狀態

 # 配置深度、模板測試depthStencilState:# 禁用深度測試,它用于判斷一個像素是否被其他像素遮擋depthTest: false# 禁用深度寫入depthWrite: false# 配置透明混合狀態blendState:targets:# 啟用混合模式# 這種混合模式是最常見的 透明度混合模式,公式為:# Final Color = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha)# 它適用于常見的半透明效果,例如透明紋理、UI元素等。- blend: true# 源因子設置為 src_alpha,表示使用片段顏色的 alpha 值作為混合因子blendSrc: src_alpha# 目標因子設置為 one_minus_src_alpha,表示使用 1 - src_alpha 作為混合因子blendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpha# 配置光柵器狀態rasterizerState:# 禁用面剔除,常見參數有:front, back, nonecullMode: none

注:能力有限,后續的學習再逐漸的補充原理相關…


屬性參數(properties)

屬性參數在CCEffect配置中,簡單可理解為:

一、定義著色器中的unifrom變量,用于處理著色器的實現邏輯。

二、在Material的屬性檢查器中顯示,用于Shader效果的可視化調整。

雖然是自定義,但畢竟涉及到Shader的實現和可視化。除了通用的屬性值:value 以外,我們可以將其分為兩部分:

注:更多參數可參考:Property 參數列表

一、samples 紋理相關

請添加圖片描述

二、editor參數

主要應用于編譯器的屬性檢查器中, 主要屬性有:
請添加圖片描述

簡單的示例:

lightCenterPoint: { value: [0.2, 0.2], editor: { tooltip: "光束中心點坐標" }}
lightAngle: { value: 36.0, editor: { tooltip: "光束傾斜角度" }}


最后


今天的文章內容大概就說到這里了,內容相關部分參考了官方文檔的一些說明,主要有:

著色器語法 :文檔內容主要講解的是Effect資源的配置結構

Pass可選配置參數: 文檔內容主要對Pass渲染中的參數進行了詳細的說明

YAML 語法:主要說明了YAML語法的使用

不瞞您說,Shader的基礎理論的確枯燥無味,然而又不得不懂,學習的過程中,好奇是雖然都存在的,我們都一樣。

就看能不能熬下去了,這里想說兩點:

一、為自己的能力不足,不能為您深入講解感到抱歉

二、期待與您一起在學習的路上變的強大

我是鶴九日,祝您生活愉快!

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

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

相關文章

AI日報 - 2025年3月10日

AI日報 - 2025年3月10日 &#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO預測強AI最早2026年到來 &#x1f52c; SAGE框架提升問答質量61.25%&#xff0c;Reflexion框架將GPT-4成功率提至91% ▎&#x1f4bc; 商業動向 | xA…

【SegRNN 源碼理解】【今天不水文系列】編碼器部分理解

我來小小的理解一下&#xff1a; 首先&#xff0c;16 batchsize&#xff0c;60sequendcelength&#xff0c;7 個特征的通俗解釋 16 個獨立的樣本&#xff0c;每個樣本有 60 個連續的時間步及對應的標簽值&#xff0c;每個時間步有 60 個特征 所以就是因為樣本是隨機從訓練集…

加速科技Flex10K-L測試機:以硬核創新重塑顯示驅動芯片測試新標桿!

在2024年召開的世界顯示產業創新發展大會上&#xff0c;加速科技自主研發的高密度顯示驅動芯片測試設備Flex10K-L憑借其突破性技術創新&#xff0c;成功入選"十大創新技術&#xff08;產品&#xff09;"。作為國內顯示驅動芯片測試領域的標桿性設備&#xff0c;Flex1…

Docker 部署 Vaultwarden

一、前言 1. 官網 1.1 Vaultwarden https://github.com/dani-garcia/vaultwarden https://github.com/wcjxixi/Vaultwarden-Wiki-Chn https://hub.docker.com/r/vaultwarden/server https://rs.ppgg.in/ # Vaultwarden Wiki 中文版 https://geekdaxue.co/read/Vaultward…

如何下載和使用Git:初學者指南

&#x1f31f; 如何下載和使用Git&#xff1a;初學者指南 在當今的軟件開發中&#xff0c;Git已經成為不可或缺的版本控制系統。無論你是獨立開發者還是團隊成員&#xff0c;掌握Git的基本操作都能幫助你更高效地管理代碼。今天&#xff0c;我將詳細介紹如何下載和使用Git&…

doris: SQL Server

Doris JDBC Catalog 支持通過標準 JDBC 接口連接 SQL Server 數據庫。本文檔介紹如何配置 SQL Server 數據庫連接。 使用須知? 要連接到 SQL Server 數據庫&#xff0c;您需要 SQL Server 2012 或更高版本&#xff0c;或 Azure SQL 數據庫。 SQL Server 數據庫的 JDBC 驅動…

Leetcode 刷題記錄 05 —— 普通數組

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答。 目錄 01 最大子數組和 方法一&#xff1a;動態規劃&#xff08;卡達尼算法&#xff09; 方法…

《DataWorks 深度洞察:量子機器學習重塑深度學習架構,決勝復雜數據戰場》

在數字化浪潮洶涌澎湃的當下&#xff0c;大數據已然成為推動各行業發展的核心動力。身處這一時代洪流&#xff0c;企業對數據的處理與分析能力&#xff0c;直接關乎其競爭力的高低。阿里巴巴的DataWorks作為大數據領域的扛鼎之作&#xff0c;憑借強大的數據處理與分析能力&…

wordpress自定the_category的輸出結構

通過WordPress的過濾器the_category來自定義輸出內容。方法很簡單&#xff0c;但是很實用。以下是一個示例代碼&#xff1a; function custom_the_category($thelist, $separator , $parents ) {// 獲取當前文章的所有分類$categories get_the_category();if (empty($categ…

2025牛客寒假算法基礎集訓營6

A.復制雞 思路&#xff1a;比較簡單&#xff0c;略。 void solve() {int n, m, k;cin >> n;int last -1, ans 0;for (int i 0; i<n; i){int x;cin >> x;if (x ! last){ans;}last x;}cout << ans << endl; } B.好伙計猜拳 思路&#xff1a;這…

【C#】詳解C#中的內存管理機制

文章目錄 前言一、C#內存管理的基本機制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;棧內存 二、 開發者需要主動管理的場景&#xff08;1&am…

ROS云課基礎題庫-01C++案例-甜甜圈

效率是核心&#xff0c;但效率高的教程會忽略掉非常多的細節。 解決問題的思路和細節對于一個問題的有效求解至關重要。 資料 云課五分鐘-02第一個代碼復現-終端甜甜圈C-CSDN博客 從云課五分鐘到五秒鐘焦慮的甜甜圈向前沖-CSDN博客 說明 復現重要性沒有那么大&#xff0c;…

C/S架構與B/S架構

一、定義與核心區別 C/S架構&#xff08;Client/Server&#xff0c;客戶端/服務器&#xff09; 客戶端需安裝專用軟件&#xff08;如QQ、企業ERP系統&#xff09;&#xff0c;直接與服務器通信。服務器端通常包括數據庫和業務邏輯處理1。特點&#xff1a;客戶端承擔部分計算任務…

【匯編語言】單片機程序執行過程

一、任務需求 指示燈LED4閃爍&#xff0c;亮0.5秒&#xff0c;滅0.5秒&#xff0c;無限循環 二、針對硬件的編程 1、確定原理圖2、確定硬件的物理關系 三、設計步驟 1.用自己的語言描述工作流程 1.1指示燈LED4亮1.2延時0.5秒1.3指示燈LED4滅1.4延時0.5秒1.5跳轉到1.1步 …

openharmony 富對富 WiFi投屏設計

castengine_wifi_display部件別名Sharing&#xff0c;媒體分享之意。擁有流媒體協議接入、媒體預覽、媒體轉分發能力&#xff0c;受投播管理服務管理和調用&#xff0c;是音視頻投播子系統重要的流媒體能力部件。提供一套簡單的Native C的接口&#xff0c;主要業務是Miracast投…

Android項目優化同步速度

最近項目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg庫&#xff0c;發現原來通過google官方的代碼倉&#xff0c;下載太慢了&#xff0c;每秒KB級別的速度。&#xff08;之前下gradle/gradle plugin都不至于這么慢&#xff09;&#xff0c;于是想到配置國內鏡像源來提…

Git 如何配置多個遠程倉庫和免密登錄?

自我簡介&#xff1a;4年導游&#xff0c;10年程序員&#xff0c;最近6年一直深耕低代碼領域&#xff0c;分享低代碼和AI領域見解。 通用后臺管理系統 代號&#xff1a;虎鯨 緣由 每次開發后臺界面都會有很多相同模塊&#xff0c;嘗試抽離出公共模塊作為快速開發的基座。 目標…

JVM組成面試題及原理

Java Virtual Machine&#xff08;JVM&#xff09;是Java程序的運行環境&#xff08;java二進制字節碼的運行環境&#xff09; 好處&#xff1a; 一次編寫&#xff0c;到處運行自動內存管理&#xff0c;垃圾回收機制 JVM由哪些部分組成&#xff0c;運行流程是什么&#xff1f;…

江科大51單片機筆記【11】AT24C02數據存儲秒表

一、數據存儲 先把需要的模塊導入做個測試 //main.c#include <REGX52.H> #include " LCD1602.h" #include " Key.h"void main() {LCD_Init();LCD_ShowString(1,1,"Hello");while(1){}} 代碼思路 分成兩塊寫&#xff0c;一塊寫I2C.c&am…

Hadoop的運行模式

Hadoop的運行模式 1、本地運行模式2、偽分布式運行模式3、完全分布式運行模式4、區別與總結 Hadoop有三種可以運行的模式&#xff1a;本地運行模式、偽分布式運行模式和完全分布式運行模式 1、本地運行模式 本地運行模式無需任何守護進程&#xff0c;單機運行&#xff0c;所有…