<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大神駕到 | 麒麟子帶你初識Cocos Shader

          共 3365字,需瀏覽 7分鐘

           ·

          2020-10-13 01:47

          一、什么是Cocos Shader

          可能有朋友會感到奇怪,百度上搜不到Cocos Shader。

          那就對了,因為Cocos Shader 是 Cocos Creator 3D Shader的簡稱。

          是麒麟子為了方便社區(qū)交流,而發(fā)明的縮寫。

          Cocos Creator 2D 和 Cocos Creator 3D合并后,材質系統(tǒng)和編輯器都將只有一個版本。

          而從目前的技術架構和官方透露的信息來看。

          合并后,技術框架采用目前Cocos Creator 3D的技術框架,因為它更成熟,更前沿,能更好地支持3D和2D。

          合并后,編輯器名稱改為 Cocos Creator 3.0,將不再有3D這樣的稱呼。因為只有一個版本。

          最終Cocos Creator 的 Shader,就是現(xiàn)在Cocos Creator 3D的Shader。

          綜上所述!

          我們現(xiàn)在就叫Cocos Creator 3D Shader 為 Cocos Shader,是一個很科學的做法。

          Cocos Shader不僅僅指著色器代碼,實際上它包含了三個東西。

          這三個東西的共同作用下,我們能夠渲染出想要的效果。

          • 「材質(material)」
          • 「效果代碼(effect)」
          • 「參數(shù)(uniform、sampler等)」

          二、Cocos材質使用步驟

          1. 創(chuàng)建一個material材質文件

          2. 指定一個要用到的effect和對應的technique

          可以簡單理解為 一個 effect 對應多個 technique,effect + technique 決定了渲染手法。

          比如 builtin-standard 包含 opaque 和 transparent 兩個 technique,前者用于實體,后者用于半透明物體。


          3. 設置好面板上的參數(shù)


          面板參數(shù)很多,但不要怕,麒麟子在這里逐一解釋一下(不需要在今天就全部弄明白,隨著學習的深入,這些參數(shù)都會明白的)。

          • 「USE LIGHTMAP」:勾選上這個選項后,表示你的模型接受LIGHTMAP處理,這個是配合場景的光照圖烘焙功能的
          • 「USE VERTEX COLOR」:是否使用頂點顏色
          • 「USE NORMAL MAP」:是否使用法線圖
          • 「HAS SECOND UV」: 是否擁有第二套UV
          • 「USE ALBEDO MAP」:是否使用顏色貼圖
          • 「PBR UV」:選擇PBR使用第一套還是第二套UV,默認是第一套
          • 「USE PBR MAP」:是否需要使用PBR貼圖,如果使用了PBR貼圖,那貼圖的通道將和occlusion,roughness,metallic值相乘作為最終的值。
          • 「USE METALLIC ROUGHNESS MAP」:是否使用金屬度和粗燥度貼圖
          • 「USE OCCLUSION MAP」:是否使用occlusion貼圖
          • 「USE EMISSIVE MAP」:是否使用自發(fā)光貼圖
          • 「USE ALPHA TEST」: 是否開啟ALPHA TEST
          • 「Tilling Offset」:紋理的縮放和偏移,xy為縮放,zw為偏移
          • 「Albedo」: 顏色,會和albedoMap相乘
          • 「AlbedoScale」: 不同通道的縮放值 這個我也沒有用過
          • 「Occlusion、Roughness、Metallic、Emissive、EmissiveScale」:這幾個的作用對應上面的那堆Map,會和那堆MAP的通道相乘作為最終結果。如果沒有指定那堆Map貼圖,則直接使用這個值。
          • 我們用得最多的就是METALLIC和ROUGHNESS,調節(jié)這兩個的值,就可以很明顯改變一個物體的反射強度和高光強度。

          4. 渲染狀態(tài)

          除了這堆 uniforms 外,偶爾我們還需要改動渲染狀態(tài)。

          但渲染狀態(tài)我們一般是不需要改動其它的。

          因為面片順序的關系,如果出現(xiàn)前后背面裁剪不對的情況。可以修改 CullMode 來解決。如下圖所示:

          img

          三、最簡單的Shader builtin-unlit

          從面板上我們就可以看出來,unlit比standard少了很多東西。他沒有PBR光照相關的東西,最復雜的效果就是渲染一個半透明帶貼圖的物體。

          我們后面的教程都將逐步在unlit這個effect上添加內容,也漸進式地掌握Cocos Shader的內容。

          請大家打開「builtin-unlit.effect」,打開方式如下圖所示:

          「Assets窗口 -> internal -> builtin-unlit -> Reveal In Explorer」(在資源管理器中打開)我們來逐一分解各部分的內容。

          1. 定義部分

          定義部分也就是文件最開始的部分,它描述了這個effect所具備的technique、pass結構以及外部變量和渲染狀態(tài)。如下圖:

          - name:對應的就是每一個 technique 名字。

          可以看到,builtin-unlit定義了

          • opaque
          • transparent
          • add
          • alpha-blend

          四個 technique,每個 technique 只有一個 pass,這里補充解釋一下pass。

          有一些效果,我們需要多次渲染同一個物體才能實現(xiàn),這個時候就需要多pass,大部分情況下,只需要一個pass就能搞定了。

          區(qū)域1:面板可見常量

          定義面板上可見的常量,也就是說,shader 中定義好的 uniform,如果要讓面板可見,就需要在這個部分做引出。

          區(qū)域2:入口函數(shù)

          定義的是vs和fs分別使用哪個入口函數(shù)。也就是說,你可以給每個pass指定不同的vs和fs shader。

          區(qū)域3:深度讀寫開關

          我們可以控制是否做深度測試和是否寫入深度。

          一般情況下,實體對象,深度測試和深度寫入都會開啟,但像技能特效中的半透明效果,就只進行深度測試,而不進行深度寫入。

          其余更復雜的情況,則需要根據(jù)具體需求來決定。

          區(qū)域4:Alpha混合控制

          這個在以前的UI面板上大家見過了,就是控制與目標緩沖區(qū)的混合方式。

          區(qū)域5:光柵化參數(shù)

          和之前提到的渲染狀態(tài)面板中的ClullMode是同一個東西。

          2. unlit-vs(即頂點著色器部分)

          如下圖所示

          img

          大家會發(fā)現(xiàn),「#if USE_VERTEX_COLOR ... #endi」f這樣的宏定義,這個宏定義會出現(xiàn)在材質面板上。

          和C++等語言中的宏定義一樣,如果這個宏沒有被定義(即面板上不勾選),那這部分的代碼相當于不存在。

          所以,在宏定義中聲明的變量,一定要在宏定義中使用,否則會報錯。

          找到所有的out變量,就能找到vert函數(shù)輸出了哪些東西。在unlit中我們可以找到

          • out float factor_fog(霧效因子)
          • out lowp vec4 v_color (頂點顏色)
          • out vec2 v_uv (頂點uv)

          三個輸出結果,vert函數(shù)本身則特別簡單,這里就不多解釋。

          3、unlit-fs(即像素著色器部分)

          如下圖所示:

          img

          寫fs的時候,只需要注意一點。那就是vs的out即為fs的in,在寫的時候也要注意宏的匹配,否則會發(fā)生編譯錯誤。

          fs只輸出1個東西,那就是顏色 ,vec4 frag的返回值就是我們最終要輸出的顏色。

          通過vs傳過來的uv和參數(shù),我們進行紋理采樣,并做一系列的運算,即可獲得我們想要的效果。

          大家可以嘗試在 「o = CC_APPLY_FOG(o,factor_fog)」 之前,對o.rgb進行一些運算,就能立即看到顏色發(fā)生了變化。

          四、結束語

          本文對 Cocos Shader 做了一個大概的介紹,使大家掌握材質的使用,材質面板參數(shù)的含義和effect文件的內容。

          感謝麒麟子大神的精彩講解,歡迎大家向公眾號投稿或提供白名單轉載,愿我們在成長的道路上砥礪前行,共同進步!




          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷情色五月天 | 操B无码视频 | 秋霞一区| 第四色婷婷激情 | 亚洲一卡二卡 |