Cocos Creator Shader入門實戰(一):材質和Effect的了解

引擎版本:3.8.5

環境: Windows


簡介


在Cocos Creator中,游戲炫彩繽紛的效果是借助著色器(Shader)來實現的。

Cocos主要基于OpenGL ES,而Shader的編寫則是在可編程渲染管線中基于修改:頂點著色器(Vertex)片段著色器(Fragment) 完成的。

Cocos官方,為了簡化著色器的復雜配置,更多靈活性,以及能夠通過編譯器進行可視化管理等等,在Cocos Creator中,實現Shader主要借助兩個文件:EffectAssetMaterial材質

兩者都屬于資源文件,簡單的理解:

一、EffectAsset 負責Shader的編寫、配置和各種屬性定義等

二、Material材質 負責對EffectAsset的數據包裝,并將一些屬性數據可視化顯示在屬性檢查器中,方便用戶管理和操作。

可以認為:在Cocos Creator中,想實現各種不同的渲染效果;需要通過Effect配置屬性和著色器編寫,通過材質來實現對Effect的包裝,進而顯示出不同的效果。

兩者是相輔相成的,缺一不可的。


學習的困惑


初次接觸材質和Effect的時候,我一臉的茫然。

畢竟從事游戲開發,像OpenGL、渲染、Shader等這些專業的術語,即使不曾使用,在面試中也是無法擺脫的。

當我第一次看到Material材質的屬性配置:
請添加圖片描述

第一次看到Effect的屬性配置:
請添加圖片描述

即使有著官方文檔的加持,我也是一臉的茫然,不知道這些到底代表著什么,以及如何使用。

再到后來,慢慢的明白:看似好像沒有接觸使用過它們,但實際上它們就像是空氣一樣,在你的周圍彌漫。

因為不管怎樣,游戲客戶端中所展現的任何可視性的效果都是渲染。

如果從細節上來說,比如:

在Creator 2.4.x版本中,關于某個Sprite的屬性顯示:

請添加圖片描述

在Creator 3.8.x版本中,關于某個Sprite的屬性顯示:
請添加圖片描述

這些都是官方對渲染組件的默認配置,前者展示了默認的材質配置,而后者雖然沒有顯示出來,但依然會默認配置。

稍微延伸下,為什么CocosCreator針對于組件的設定,分為UI組件和渲染組件呢,原因也在這里。

困惑、畏難這些都是難免的,早晚都需要經歷和學習,這里提前預祝您的成功。

注:當你慢慢開始學習的時候,你可能會想我一樣:哦,原來是這樣子!


編譯器創建


接下來,我們繼續說明材質Material和EffectAsset。在編譯器中,它們都是支持編譯器創建的。


材質的構建

主要有兩種:

一、物理材質:Physics Material,主要用于記錄物體的物理屬性相關,被用于碰撞系統。

二、普通材質: Material,主要被用于管理Effect資源,并控制著色效果的展示。

請添加圖片描述

以普通材質Material為例,創建后的屬性如下圖所示:

請添加圖片描述

主要屬性有:

  • sphere: 材質的預覽效果,可選擇box、sphere、capsule等進行預覽
  • Light: 指的是是否啟用光照效果
  • Effect: 指的是材質當前使用的著色器,可通過下拉框進行選擇
  • Technique: 指的是材質使用著色器中的哪種技術
  • Pass… 指的是Effect中Technique所包含的Pass流程,每種Technique可以包含多個Pass
  • USE INSTANCING 指的是Effect中宏定義的開關

針對于Technique、Pass和宏定義這三個參數,是在Effect中使用 YAML語言配置的參數屬性。


EffectAsset的構建

著色器資源的創建,編譯器同樣支持兩種:

一、傳統無光照著色器: Effect,同文字描述所言,沒有光照效果的實現。

二、表面著色器:Surface Effect, 基于PBR的著色器。

PBR全稱:Physically Based Rendering 基于物理的光照模型

CocosCreator 從 v3.0 開始提供了基于物理渲染(PBR)的光照著色器:builtin-standard.effect

它可根據現實中光線傳播原理和能量守恒定律,模擬出近似于真實物理光照的效果,主要用于3D。

請添加圖片描述

這里以構建無光照的著色器為例,創建后的屬性如下:

請添加圖片描述

主要屬性部分有:

  • shaders : 當前的著色器名稱相關
  • Precompile Combinations 預處理宏定義組合相關,通過on/off的開關來決定是否是否啟用
  • GLSL 300 ES/100 Output 著色器的輸出模式和預覽

這里要說明下:

一、宏定義的組合可以更靈活的實現不同著色器效果的實現,并實現復用性。

二、300 ES 和 100 是引擎主要用于適配不同的WebGL版本和硬件支持。

前者基于WebGL 2.0標準,支持更多的圖形功能、更復雜著色器功能實現和更高的性能化;而后者主要基于WebGL 1.0標準,功能有限,主要用于向下兼容舊的硬件和瀏覽器。

三、輸出的代碼是引擎根據Effect提供的配置參數,解析后生成的。

在實際的編寫中,我們只需關注:

  • CCEffect屬性的配置

  • CCProgram著色器片段的編寫


寫到最后

今天的文章暫且就告一段落,因為貪多嚼不爛。

另外,總結了幾個小小的想法或者說是建議,主要有這么幾點:

一、Shader的使用,由于游戲引擎的封裝的便利性,很可能導致我們認為這是一門很遙遠的技術,不是不用,而是沒有關注過。

二、請不要過于的追求極致性,還有真正的了解,便開始了各種底層的學習,先模仿再創造,先完成再完美。

三、CocosShader效果的實現需要借助Material來,我們通過代碼實現Effect效果也是通過獲取材質來設置屬性。

四、Effect的實現主要兩部分: 一是通過CCEffect配置屬性 二是通過CCProgram編寫著色器片段。

理解可能有誤,但依然希望能夠幫助到您,感謝!

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

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

相關文章

akka現有的分布式定時任務框架總結

根據你的需求,以下是一些基于 Akka 實現的分布式定時任務框架,以及相關的 GitHub 項目推薦: 1. Openjob Openjob 是一個基于 Akka 架構的新一代分布式任務調度框架,支持多種定時任務、延時任務、工作流設計,采用無中…

微信小程序地圖map全方位解析

微信小程序地圖map全方位解析 微信小程序的 <map> 組件是一個功能強大的工具&#xff0c;可以實現地圖展示、定位、標注、路徑規劃等多種功能。以下是全方位解析微信小程序地圖組件的知識點&#xff1a; 一、地圖組件基礎 1. 引入 <map> 組件 在頁面的 .wxml 文…

Python的PyTorch+CNN深度學習技術在人臉識別項目中的應用

人臉識別技術是一種基于人臉特征進行身份識別的生物識別技術&#xff0c;其核心原理包括人臉檢測、人臉對齊、特征提取、特征匹配、身份識別。 一、應用場景 安防&#xff1a;門禁、監控。 金融&#xff1a;刷臉支付、身份驗證。 社交&#xff1a;自動標注、美顏。 醫療&am…

《數據庫索引設計與優化》譯本錯誤糾正(1)

今天在學習《數據庫索引設計與優化》第十一章第198頁的時候遇到一個問題&#xff0c;即參數的文字描述與實際不符。我看的是從網絡上找到的譯本&#xff0c;許多喜歡白嫖的朋友可能也會像我一樣遇到這種問題。 可以看到&#xff0c;上面對參數Z的描述是&#xff1a;Z上一次索引…

API測試工具:Swagger vs Postman 2025最新全面對比

隨著微服務架構的普及和云原生應用的激增&#xff0c;高效的 API 開發、測試和文檔管理工具變得越來越重要。在眾多 API 工具中&#xff0c;Swagger 和 Postman 各自以不同的方式解決著 API 開發生命周期中的關鍵問題&#xff0c;本文將從多個維度深入對比這兩款工具&#xff0…

如何查詢SQL Server數據庫服務器的IP地址

如何查詢SQL Server數據庫服務器的IP地址 作為數據庫管理員或開發人員&#xff0c;了解如何查詢SQL Server數據庫服務器的IP地址是一項重要技能。本文將介紹幾種簡單而有效的方法&#xff0c;幫助你輕松獲取這一信息。無論你是新手還是經驗豐富的專業人士&#xff0c;這些方法…

centos 7 安裝python3 及pycharm遠程連接方法

安裝openssl 使用pip3安裝 virtualenv的時候會提示WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 這是因為缺少openssl 2.0以上版本 解決辦法&#xff1a; 一、先確認版本 openssl version 二、安…

AI人工智能之機器學習sklearn-數據預處理和劃分數據集

1、概要 本篇學習AI人工智能之機器學習sklearn數據預處理和劃分數據集&#xff0c;從代碼層面講述如何進行數據的預處理和數據集劃分。 2、簡介 本片講述數據預處理的標準化處理、歸一化處理&#xff0c;以常用的兩個類為例 標準化處理類 StandardScaler歸一化處理類 MinMax…

智能硬件-01智能停車場

行業背景 隨著現代人們生活水平的提高&#xff0c;私家車輛在不斷增加&#xff0c;小區將面臨著臨時車用戶要多于固定車用戶的窘境&#xff0c;尤其是在早晚高峰時段車輛出入擁堵&#xff0c;對小區的車輛管理難度越來越大&#xff0c;對停車場收費員的崗位要求越來越高&#…

定長內存池的實現、測試及錯誤分析

背景 C/C 申請內存使用的是 malloc &#xff0c;malloc 其實就是一個大眾貨&#xff0c;什么場景下都可以用&#xff0c;但是什么場景下都可以用就意味著什么場景下都不會有很高的性能。 定長內存池解決固定大小的內存申請釋放需求&#xff0c; 性能達到極致&#xff0c;不考…

vue3 下載文件 responseType-blob 或者 a標簽

在 Vue 3 中&#xff0c;你可以使用 axios 或 fetch 來下載文件&#xff0c;并將 responseType 設置為 blob 以處理二進制數據。以下是一個使用 axios 的示例&#xff1a; 使用 axios 下載文件 首先&#xff0c;確保你已經安裝了 axios&#xff1a; npm install axios然后在你…

Search API:讓數據獲取變得簡單高效的搜索引擎代理商

Search API&#xff1a;讓數據獲取變得簡單高效的搜索引擎代理商 在當今數字化時代&#xff0c;數據驅動的決策變得越來越重要&#xff0c;而獲取精準、實時的數據是眾多企業、研究機構和開發者的核心需求。然而&#xff0c;直接爬取搜索引擎或行業資訊網站可能會遇到諸多挑戰&…

halcon三維對象處理例程總結(二)

目錄 一、intersect_plane_object_model_3d二、interactive_intersection三、measure_plant四、moments_object_model_3d五、projective_trans_object_model_3d六、read_object_model_3d_generic_ascii一、intersect_plane_object_model_3d 計算三維物體模型與平面之間的相交部…

基于 Python 的項目管理系統開發

基于 Python 的項目管理系統開發 一、引言 在當今快節奏的工作環境中&#xff0c;有效的項目管理對于項目的成功至關重要。借助信息技術手段開發項目管理系統&#xff0c;能夠顯著提升項目管理的效率和質量。Python 作為一種功能強大、易于學習且具有豐富庫支持的編程語言&…

2月24(信息差)

&#x1f30d;“任意舞蹈任意學”&#xff01;宇樹機器人又進化了 傳Meta有意合作拋出橄欖枝 &#x1f384;兩部門&#xff1a;深入推進公路沿線充電基礎設施建設 推動大功率充電技術標準應用 ?小米15 Ultra、小米SU7 Ultra定檔2月27日 雷軍宣布&#xff1a;向超高端進發 1.…

mysql 遷移到人大金倉數據庫

我是在windows上安裝了客戶端工具 運行數據庫遷移工具 打開 在瀏覽器輸入http://localhost:54523/ 賬號密碼都是kingbase 添加mysql源數據庫連接 添加人大金倉目標數據庫 添加好的兩個數據庫連接 新建遷移任務 選擇數據庫 全選 遷移中 如果整體遷移不過去可以單個單個或者幾個…

C++和OpenGL實現3D游戲編程【連載23】——幾何著色器和法線可視化

歡迎來到zhooyu的C++和OpenGL游戲專欄,專欄連載的所有精彩內容目錄詳見下邊鏈接: ??C++和OpenGL實現3D游戲編程【總覽】 1、本節實現的內容 上一節課,我們在Blend軟件中導出經緯球模型時,遇到了經緯球法線導致我們在游戲中模型光照顯示問題,我們在Blender軟件中可以通過…

JUC并發—12.ThreadLocal源碼分析

大綱 1.ThreadLocal的特點介紹 2.ThreadLocal的使用案例 3.ThreadLocal的內部結構 4.ThreadLocal的核心方法源碼 5.ThreadLocalMap的核心方法源碼 6.ThreadLocalMap的原理總結 1.ThreadLocal的特點介紹 (1)ThreadLocal的注釋說明 (2)ThreadLocal的常用方法 (3)ThreadL…

Deepseek和Grok 3對比:寫一段冒泡排序

1、這是訪問Grok 3得到的結果 2、grok3輸出的完整代碼&#xff1a; def bubble_sort(arr):n len(arr) # 獲取數組長度# 外層循環控制排序輪數for i in range(n):# 內層循環比較相鄰元素&#xff0c;j的范圍逐漸減少for j in range(0, n - i - 1):# 如果當前元素大于下一個元…

Java-01-源碼篇-04集合-05-ConcurrentHashMap(1)

1.1 加載因子 加載因子&#xff08;Load Factor&#xff09;是用來決定什么時候需要擴容的一個參數。具體來說&#xff0c;加載因子 當前元素數量 / 桶的數量&#xff0c;當某個桶的元素個數超過了 桶的數量 加載因子 時&#xff0c;就會觸發擴容。 我們都知道 ConcurrentHas…