Cocos Creator Shader入門實戰(八):Shader實現圓形、橢圓、菱形等頭像

引擎:3.8.5

您好,我是鶴九日!



回顧


Shader的學習是一條漫長的道路。

理論知識的枯燥無味,讓很多人選擇了放棄。然而不得不說:任何新知識、新領域的學習,本身面臨的都是問題!

互聯網和AI給了我們很多的便利性,這里羅列些個人學習使用到資料,希望對您有用。

The Book of shaders 片段著色器的入門指南

Learn OpenGL 中文版 講解Open GL的學習使用

CocosCreatorShader 木限東的Shader效果實現實例,這里感謝作者的公開分享。

慎入!史上最強 Cocos Shader 學習資源推薦(建議收藏) Cocos官方推薦的學習資源。

注:感謝Cocos官方、感謝熱心的大佬的內容整理和分享!



前言


后續的文章將逐步開始匯總一些,自己在學習Shader中編寫的一些效果。

當然,這些效果的實現,并非個人創造,可能是一些模仿,然后是模仿中的延伸。

正式開始文章之前,想告訴您兩件事:

一、因Shader效果的實現,需要CCEffect屬性配置和 CCProgram著色器代碼,它們存在相通部分;后續的文章僅會粘貼關鍵部分,避免篇幅過長。

二、個人編寫的Shader效果Demo示例,使用的是Gitee倉庫,名為:CocosShaderDemo

內容的主要結構是:

請添加圖片描述

  • res/common 放置通用的chunk或者其他相關,頂點著色器部分的chunk,就在此處。

  • res/effect 放置一些.effect/.material的shader文件,除后綴不同外,名字相同。

  • resources/prefab 放置效果實現的預制體頁面

  • script/effect 一些effect效果的實現腳本

注:我曾考慮過像木限東大佬一樣,每個效果對應一個項目工程,這樣版本管理控制靈活。

但又考慮到可能查看不便,便采用了此中方式。

頁面的配置使用的是LayerConfig.ts,主要配置結構:

請添加圖片描述

實現效果頁面如下:
請添加圖片描述

注:代碼倉庫CocosShaderDemo,因時間限制,文檔的補充并不完善,希望您能諒解!



開始


今天的內容,講解的主要是: Shader自定義不同形狀的頭像。

如果不考慮Shader的話,使用Mask遮罩也是可以實現不同形狀頭像的,只是Mask的使用會影響渲染合批,導致性能不高。

既然學習到Shader,我們便用Shader來實現吧。先看示意圖:

請添加圖片描述

注:圓形頭像的實現,參考的是: 木限東 ,其他是延伸,對應的個人倉庫:地址



圓形頭像


Shader實現的圓形頭像,同Mask實現,其實有相似之處。

Mask的實現是構建一個不同形狀的約束框遮罩層,在遮罩層內顯示圖像,遮罩范圍外則裁切,不會進行渲染。

放到Shader當中,Shader處理的是像素,則指定形狀內進行繪制,形狀以外的裁切,不進行繪制而已。

只是Shader比Mask相比,有著更高的靈活度,比如邊緣的模糊度處理、抗鋸齒等。


屬性配置

實現圓形頭像,properties的屬性配置如下:

properties:alphaThreshold: { value: 0.5 }wh_ratio: { value: 1, editor: { tooltip: "寬高比"}}blur: { value: 0.01, editor: { tooltip: "光圈模糊程度"}}radius: { value: 0.5, editor: { tooltip: "光圈半徑"}}center: { value: [0.5, 0.5], editor: { tooltip: "光圈中心"}}

片段著色器部分的主要邏輯如下:

CCProgram sprite-fs %{// 自定義參數的說明,注意UBO內存對齊規則uniform ARGS{float radius;       // 光圈半徑float blur;         // 光圈模糊程度vec2 center;        // 光圈中心點float wh_ratio;     // 寬高比};vec4 frag () {// 初始化顏色值為白色且不透明vec4 o = vec4(1, 1, 1, 1);// 通過CCSampleWithAlphaSeparated函數從紋理中采樣顏色,并將其與初始顏色o相乘。o *= CCSampleWithAlphaSeparated(cc_spriteTexture, v_uv0);// 將采樣得到的顏色與頂點顏色v_color相乘,得到最終的顏色值o *= v_color;// 執行透明度測試,根據o的透明度值決定是否丟棄當前片段ALPHA_TEST(o);// 計算圓形的半徑平方,用于后續的圓形邊界判斷float circle = radius * radius;// 計算當前片段的紋理坐標與圓形中心點的偏移量,并考慮寬高比wh_ratio對x方向的調整float rx = (v_uv0.x - center.x) * wh_ratio;float ry = v_uv0.y - center.y;// 計算當前片段到圓形中心點的距離平方float dis = rx * rx + ry * ry;// smoothstep函數的作用是在兩個邊緣值之間平滑過渡,降低鋸齒// circle是圓形的邊界,circle - blur是模糊的起始邊界,dis是當前片段到中心的距離平方o.a = smoothstep(circle, circle - blur, dis) * o.a;return o;}
}

最后添加下Material材質,并設定Effect;然后將材質資源放到對應精靈的customMaterial屬性中,即可。

注: 代碼中的注釋很詳細了,我就不再一一贅述了,后面的實現,與之類似。



橢圓頭像


橢圓頭像同圓形頭像類似,只不過使用shader要生成橢圓而已。

屬性配置:

radiusX: { value: 0.5, editor: { tooltip: "橢圓的X軸半徑"}}
radiusY: { value: 0.3, editor: { tooltip: "橢圓的Y軸半徑"}}
blur: { value: 0.1, editor: { tooltip: "橢圓邊緣的模糊程度"}}
center: { value: [0.5, 0.5], editor: { tooltip: "光圈中心"}}

關鍵性片段代碼:

uniform ARGS {vec2 center;       // 橢圓中心點float radiusX;     // 橢圓的X軸半徑float radiusY;     // 橢圓的Y軸半徑float blur;        // 橢圓邊緣的模糊程度
};vec4 frag () {// ...// 計算橢圓的邊界條件float rx = (v_uv0.x - center.x) / radiusX;float ry = (v_uv0.y - center.y) / radiusY;float dis = rx * rx + ry * ry;// smoothstep函數的作用是在兩個邊緣值之間平滑過渡,降低鋸齒o.a = smoothstep(1.0, 1.0 - blur, dis) * o.a;return o;
}

注: ARGS參數的設定,注意UBO內存規則,否則容易報錯。詳情:ERROR_EFX2205



四邊形頭像


屬性配置:

size: { value: 0.5, editor: { tooltip: "四邊形的大小"}}
angle: { value: 0.26, editor: { tooltip: "傾斜角度"}}
blur: { value: 0.05, editor: { tooltip: "邊緣的模糊程度"}}
center: { value: [0.5, 0.5], editor: { tooltip: "中心點"}}

關鍵代碼:

// 計算當前像素相對于中心點的偏移
vec2 offset = v_uv0 - center;// 應用旋轉矩陣,將坐標旋轉回未傾斜的狀態
float cosA = cos(-angle);
float sinA = sin(-angle);
vec2 rotatedOffset = vec2(offset.x * cosA - offset.y * sinA,offset.x * sinA + offset.y * cosA
);// 判斷是否在菱形區域內
float diamond = abs(rotatedOffset.x) + abs(rotatedOffset.y);// 使用smoothstep將菱形的邊緣虛化,降低鋸齒
o.a = smoothstep(size, size - blur, diamond) * o.a;


總結


如上效果,關于屬性參數的配置,均可通過材質的屬性檢查器進行設置。

請添加圖片描述

當然,也可以通過代碼腳本的setProperty屬性進行動態設置,以圓形頭像的寬高比為例:

@property(Sprite)
circleSprite!: Sprite;                  // 圓形頭像protected start(): void {// 圓形頭像設置寬高比let avatarSize = this.circleSprite.getComponent(UITransform).contentSize;let ratio = avatarSize.width / avatarSize.height;const circleMaterial = this.circleSprite.getSharedMaterial(0);circleMaterial.setProperty("wh_ratio", ratio);
}

數學公式在這里暫且就不說明了,有兩點考慮:

一、數學公式的繁雜性,如果不懂,會讓人產生更多的畏難。

二、學習的興趣在于好奇,好奇+想象力,會讓人發現更多有意思的地方。

綜上,內容有些淺顯,只是我更希望:作為新人,降低畏難度,增加好奇和興趣,也很有用。

今天的文章,到這里就結束了;可能理解有誤,歡迎您的指出!

如果覺得文章不錯,期待您的點贊和留言,感謝!

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

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

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

相關文章

深入理解計算機操作系統(持續更新中...)

文章目錄 一、計算機系統漫游1.1信息就是位上下文 一、計算機系統漫游 1.1信息就是位上下文 源程序實際上就是一個由值0和1組成的位(又稱為比特),八個位被組織成一組,稱為字節。每個字節表示程序中的某些文本字符 大部分現代計…

YOLO V8的??Anchor-Free??、??解耦頭(Decoupled Head)、損失函數定義(含??Varifocal Loss)

YOLOv8 的 ??Anchor-Free?? 設計摒棄了傳統 YOLO 系列中依賴預定義錨框(Anchor Boxes)的機制,轉而直接預測目標的中心點和邊界框尺寸。這種設計簡化了模型結構,降低了超參數調優的復雜度提升了檢測速度和精度。以下是其核心實…

QuarkPi-CA2 RK3588S卡片電腦:6.0Tops NPU+8K視頻編解碼+接口豐富,高性能嵌入式開發!

QuarkPi-CA2 RK3588S卡片電腦:6.0Tops NPU8K視頻編解碼接口豐富,高性能嵌入式開發! 芯片框架 視頻介紹 https://www.bilibili.com/video/BV1btdbYkEjY 開發板介紹 核心升級,產品炸裂 QuarkPi-CA2卡片電腦搭載瑞芯微RK3588S芯片…

【響應式編程】Reactor 常用操作符與使用指南

文章目錄 一、創建操作符1. just —— 創建包含指定元素的流2. fromIterable —— 從集合創建 Flux3. empty —— 創建空的 Flux 或 Mono4. fromArray —— 從數組創建 Flux5. fromStream —— 從 Java 8 Stream 創建 Flux6. create —— 使用 FluxSink 手動發射元素7. generat…

從靜態綁定驅動模型到現代設備模型 —— 一次驅動架構的進化之旅

🔍 B站相應的視屏教程: 📌 內核:博文視頻 - 從靜態綁定驅動模型到現代設備模型 在 Linux 內核的發展歷程中,設備驅動結構經歷了從"硬編碼 手動注冊"的早期實現方式,到"設備模型統一管理&qu…

Embedding質量評估、空間塌縮、 Alignment Uniformity

Embedding質量的評估和空間塌縮的解決是自然語言處理(NLP)和推薦系統領域的關鍵問題。以下是綜合多篇研究的總結: 一、Embedding質量評估方法 基準測試與任務指標 MTEB/C-MTEB:使用多語言或中文的基準測試集(如58個數據…

批量給dwg顯示略縮圖_c#插件實現(com)

如果,cad文件無略縮圖: AutoCAD2021版本以上,命令行輸入"netload "加載此dll插件,然后輸入 “lst”,選擇文件夾,即可一鍵實現給dwg增加略縮圖。 效果如下: 附部分代碼: …

嬰幼兒托育服務與管理實訓室:托育未來的基石

在社會對嬰幼兒托育服務的重視程度不斷加深的當下,專業托育人才的需求急劇增長。嬰幼兒托育服務與管理專業作為培育這類人才的關鍵途徑,要求學生熟練掌握嬰幼兒身心發展、飲食營養以及衛生保健等基礎知識,同時具備全面的照護與管理能力。要實…

(自用)若依生成左樹右表

第一步: 在數據庫創建樹表和單表: SQL命令: 商品表 CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255) , price DECIMAL(10, 2) , stock INT NOT NULL, category_id INT NOT NULL); 商品分類…

Linux:DNS服務配置(課堂實驗總結)

遇到的問題,都有解決方案,希望我的博客能為你提供一點幫助。 操作系統:rocky Linux 9.5 ??一、配置DNS服務器的核心步驟?? 步驟 1:安裝 BIND 軟件?? ??檢查是否安裝??: rpm -qa | grep "^bind"…

搭建一個Spring Boot聚合項目

1. 創建父項目 打開IntelliJ IDEA,選擇 New Project。 在創建向導中選擇 Maven,確保選中 Create from archetype,選擇 org.apache.maven.archetypes:maven-archetype-quickstart。 填寫項目信息: GroupId:com.exampl…

若依前后端分離版運行教程、打包教程、部署教程

后端打包教程 注意:需要先運行redis 2、前端運行教程 2.1安裝依賴 2.2運行 打開瀏覽器查看,地址:http://localhost:80 3、前端打包教程 3.1打包 3.2運行打包好的文件,先找到打包好的文件 這是nginx的文件結構 將打包好的文件放到html目錄下…

SpringAi 會話記憶功能

在使用chatGPT,豆包等產品后,就會發現他們的會話有“記憶”功能。 那么我們用API接口的話,這個是怎么實現的呢? 屬于比較粗暴的方式,把之前的內容與新的提示詞一起再次發給大模型。讓我們看到他們有記憶功能。 下面介紹…

基于Python的經濟循環模型構建與可視化案例

一、代碼結構概覽 該代碼構建了一個包含經濟數據生成、可視化分析和政策模擬的交互式經濟系統仿真平臺,主要包括三大模塊: 多部門經濟數據生成:模擬包含產業關聯的復雜經濟數據 增強型可視化:提供多維度的經濟數據分析視圖 Das…

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 部分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多,但是G題想簡單了出大問題,預估50101015120860,道阻且長,再接再厲 A: 攻擊次數 答案:103?181?題目沒說明白每回合是…

C++基礎精講-05

文章目錄 1.構造函數初始化列表1.1 初始化列表的使用1.2 有參構造函數的默認值 2.對象所占空間大小2.1 大小的計算2.2 內存對齊機制 3. 析構函數3.1 基本概念3.2 總結 4.valgrind工具集4.1 介紹4.2 memcheck的使用 5. 拷貝構造函數5.1 拷貝構造函數定義5.2 淺拷貝/深拷貝5.3 拷…

文章記單詞 | 第28篇(六級)

一,單詞釋義 shirt /???t/ n. 襯衫;襯衣commonly /?k?m?nli/ adv. 通常地;一般地;普遍地pick /p?k/ v. 挑選;采摘;撿起;選擇;n. 選擇;鶴嘴鋤;精華com…

安裝低版本Pytorch GPU

網上很多教程都是自動安裝,不指定版本,其實有大問題。而且torch、torchvision、torchaudio的版本必須是對應,所以一旦版本不對,就可能會出現各種問題。 其實Pytorch官網就已經給出了安裝低版本的教程 登入Pytorch官網 點擊previo…

2025認證杯挑戰賽B題【 謠言在社交網絡上的傳播 】原創論文講解(含完整python代碼)

大家好呀,從發布賽題一直到現在,總算完成了認證杯數學中國數學建模網絡挑戰賽第一階段B題目謠言在社交網絡上的傳播完整的成品論文。 本論文可以保證原創,保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半…

并發編程--互斥鎖與讀寫鎖

并發編程–互斥鎖與讀寫鎖 文章目錄 并發編程--互斥鎖與讀寫鎖1. 基本概念2. 互斥鎖2.1 基本邏輯2.2 函數接口2.3示例代碼12.4示例代碼2 3. 讀寫鎖3.1 基本邏輯3.2示例代碼 1. 基本概念 互斥與同步是最基本的邏輯概念: 互斥指的是控制兩個進度使之互相排斥&#x…