Creator 3D 材質系統:曲面效果如何實現?

2021-02-18 COCOS

前不久發布的 Cocos Creator 1.0.2 版本中正式加入了對 OPPO 小遊戲、vivo 小遊戲以及華為快遊戲平臺的支持,在諸多 Creator 3D 製作的小遊戲案例中,《豬豬俠:極速狂飆》已上線 OPPO 小遊戲平臺。

這款休閒跑酷小遊戲,採用了曲面材質效果來使跑酷賽道更加多變有趣,今日,Cocos 引擎開發工程師 ChiaNing 將為各位開發者來解析這種曲面效果的實現思路和方案,在閱讀完本文之後,大家便可以將這種效果應用在自己的遊戲中。

在固定背後視角的跑酷遊戲中,玩家面對的始終是前方布滿障礙的賽道,除去有趣的障礙設計可以一直吸引玩家的注意外,許多遊戲還會添加一些視覺效果來使遊戲畫面看起來更豐富有趣,比如今天我們要分享的這款《豬豬俠:極速狂飆》就採用了曲面的效果使得賽道看起來更多變,也更有立體感縱深感

 

那麼,這樣的曲面效果在 Cocos Creator 3D 中是如何實現的呢?

要實現曲面的效果,我們有幾種方案可選擇:

1. 直接使用曲面模型

這是最直觀最容易想到的實現方案,從模型層面直接將效果做好,省去了其他處理,但這種方案也存在著很多嚴重的問題:

(1)模型復用不便,模型生成時的狀態幾乎決定了它的使用場合,這對於遊戲開發中需要大量復用資源以減小包體來說有嚴重的問題。

(2)對於跑酷遊戲這種物理需求並不複雜的遊戲來說,大部分的遊戲邏輯都可以直接通過計算直接完成而並不需要依賴物理引擎實現,對於正常的模型來說,規則的形狀對於邏輯實現是很友好的,但是啟用曲面模型就會對這種計算帶來很多困難,幾乎只能通過使用物理引擎來實現,過多的物理計算對性能是會有較大的影響的。

包體不友好,性能不友好,異型模型還會對製作帶來麻煩,對於只是為了實現顯示效果來說,這些損耗得不償失。

2. 使用材質系統實現

我們需要明白一點,要實現的曲面的效果,實際上影響的只有顯示效果,與其他的任何系統是不相關的,它不應當影響到其他無關的模塊,既然只想改變顯示,那採用材質系統相較於採用曲面模型的方案有著諸多好處:

(1)不必使用物理引擎,簡單的物理效果可以通過計算來實現,效率更優。

(2)模型可復用,想要實現不同的彎曲效果也很方便,只要使用帶有曲面效果的不同參數的材質即可實現同一模型的不同效果。相較於方案一的多重模型來說,只需要幾個材質即可解決問題。

(3)參數可配置,可以通過參數調節來得到不同的效果。

分析看來,相較於直接使用曲面模型的方案來說,使用材質系統實現的方案優勢很明顯,沒有額外的開銷,也沒有太大的包體負擔。

綜上所述,使用材質系統實現更能滿足我們的需求,因此採用材質系統來實現這個效果。

從需求來看,我們的目的是實現一個與我們的觀察點相關的模型變形,既然只是變形,並不涉及到顏色的變化和處理,那麼需要處理的就只有頂點著色器部分,並不涉及片段著色器。對於不太清楚渲染管線各個階段的讀者,可以參考 [LearnOpenGL]的渲染管線介紹。

在 Shader 中,通過頂點著色器即可完成對模型頂點位置的操作。

明確了是對頂點位置進行操作後,我們將攝像機所在的點定為原點。

由於我們的攝像機是固定在人物背後,且賽道始終保持向 Z 軸負方向延伸,所以可以將模型與攝像機的 Z 軸方向的距離看作函數的輸入值,想要得到曲面的效果,模型的點的變化規律如下:

由上述兩條規律不難得出,二次函數的變化規律與我們想要實現的曲面效果的規律契合,所以我們的頂點著色器的運算為一個關於頂點位置 Z 值的二次函數運算。

我們剛剛得出的規律是建立在一個特定空間下的,即以攝像機為原點的空間,這個空間正是空間變換中的觀察空間階段,所以我們之後對頂點的操作正是在這個空間中進行才能夠得到正確的結果。

Cocos Creator 3D 提供了完備的材質系統,基於這套材質系統,我們能夠很方便地在引擎中創建使用編輯材質,並且在場景預覽窗口能夠隨時觀察到材質更改所帶來的變化。

在 Cocos Creator 3D 編輯器中與材質系統相關的資源有兩種,分別為:

Effect 資源

此類型資源為符合 Cocos Effect 語法標準的渲染流程描述文件,由 YAML 格式的流程控制清單和基於 GLSL 300 ES 語法的 Shader 片段共同組成。

Material 資源

此資源可看做是 Effect 資源在場景中的資源實例,其本身除了 Effect 資源的引用外,還包括很多可配置參數以決定 Material 的狀態。在實際使用中,我們的模型是需要使用 Material 資源的,這樣就可以實現使用同一個 Effect 但參數不同以實現不同效果的需求了。

材質的使用也非常的方便,在 Cocos Creator 3D 編輯器的資源管理器中右鍵即可新建出 Effect 資源和 Material 資源。

在 Material 資源可選擇需要使用的 Effect 還可對其他參數進行配置,完成配置並保存後,選中需要使用材質的模型,選中需要的 material 或者直接將 material 拖入框中即可完成材質的設置。

具體詳盡的材質介紹和參數表請參看官方文檔[材質系統]。

思路已經很清晰了,那麼現在開始著手實現 Shader。下面是具體的實現步驟:

1、啟動 Cocos Creator 3D 編輯器(以下簡稱編輯器),為實驗方便,使用最簡單的場景即可,新建場景後,在場景編輯器中新建一個 Plane 模型,之後以此對象作為查看 Shader 效果的對象。

2、在編輯器的資源管理器中右鍵新建 Effect,將其命名為 curved 或者符合要求的名字。

3、這時新建的 Effect 文件為編輯器內置的 Effect 模板,其包含了最基礎的 shader 結構,我們需要在這個基礎上添加我們需要的功能,關於 Effect 的具體介紹請參看我們的[材質 Effect 文檔],在裡我只對我們需要的更改做出介紹。

4、先來看 CCEffect 部分:

CCEffect %{      techniques:      - name: opaque        passes:        - vert: general-vs:vert # builtin header          frag: unlit-fs:frag          properties: &props            mainTexture:    { value: white }            mainColor:      { value: [1, 1, 1, 1], editor: { type: color } }      - name: transparent        passes:        - vert: general-vs:vert # builtin header          frag: unlit-fs:frag          blendState:            targets:            - blend: true              blendSrc: src_alpha              blendDst: one_minus_src_alpha              blendSrcAlpha: src_alpha              blendDstAlpha: one_minus_src_alpha          properties: *props    }%

    

在默認的 Effect 模板中,我們需要更改的是 vert 欄位所使用的 Shader 片段,默認模板中提供的 general-vs:vert 是內置的頂點著色器,所以我們需要將其替換為我們即將實現的頂點著色器的名字(暫定為 unlit-vs).

接下來,需要對 properties 部分進行修改,property 列表將會將屬性暴露在編輯器面板上方便我們的編輯和更改。

此時需要決定哪些數據是需要作為 uniform 傳入 shader 中對效果做出影響的了,結合之前分析的需求:需要有一個決定模型點在各個分量軸上偏置值的偏置位置信息,我們使用一個 vec4 來存儲這個偏置值(allOffset);需要有一個決定偏置變化的係數的值,使用一個 float 即可(dist);還可以添加模型的主貼圖等(mainTexture)

經過以上更改之後,Effect 的 CCEffect 部分看起來是這個樣子的:

CCEffect %{        techniques:        - name: opaque          passes:          - vert: unlit-vs:vert            frag: unlit-fs:frag            properties: &props              mainTexture:  { value: grey         }              allOffset:    { value: [0, 0, 0, 0] }              dist:         { value: 1            }        - name: transparent          passes:          - vert: unlit-vs:vert            frag: unlit-fs:frag            depthStencilState:              depthTest: true              depthWrite: false            blendState:              targets:              - blend: true                blendSrc: src_alpha                blendDst: one_minus_src_alpha                blendDstAlpha: one_minus_src_alpha            properties: *props      }%

5、由於默認的 Effect 模板中使用了內置的頂點著色器,所以這裡需要實現自己的頂點著色器,可以參考內置的 builtin-unlit 的實現來編寫此段 shader:

uniform Constants {vec4 allOffset;float dist;};

vec4 position;CCVertInput(position);
highp mat4 matWorld;CCGetWorldMatrix(matWorld);

highp vec4 vpos = cc_matView * matWorld * position;highp float zOff = vpos.z / dist;vpos += allOffset * zOff * zOff;highp vec4 pos = cc_matProj * vpos;

v_uv = a_texCoord;return pos;

6、對於片段著色器,我們並未做特殊的操作,所以直接使用默認提供的就可以。

7、最終的 effect 如下:

CCEffect %{      techniques:      - name: opaque        passes:        - vert: unlit-vs:vert          frag: unlit-fs:frag          properties: &props            mainTexture:  { value: grey         }            allOffset:    { value: [0, 0, 0, 0] }            dist:         { value: 1            }      - name: transparent        passes:        - vert: unlit-vs:vert          frag: unlit-fs:frag          depthStencilState:            depthTest: true            depthWrite: false          blendState:            targets:            - blend: true              blendSrc: src_alpha              blendDst: one_minus_src_alpha              blendDstAlpha: one_minus_src_alpha          properties: *props    }%
CCProgram unlit-vs %{ precision highp float; #include <cc-global> #include <cc-local-batch> #include <input>
in vec2 a_texCoord; out vec2 v_uv;
uniform Constants { vec4 allOffset; float dist; };
highp vec4 vert () { vec4 position; CCVertInput(position);
highp mat4 matWorld; CCGetWorldMatrix(matWorld);
highp vec4 vpos = cc_matView * matWorld * position; highp float zOff = vpos.z / dist; vpos += allOffset * zOff * zOff; highp vec4 pos = cc_matProj * vpos;
v_uv = a_texCoord; #if FLIP_UV v_uv.y = 1.0 - v_uv.y; #endif return pos; } }%
CCProgram unlit-fs %{ precision highp float; #include <output>
in vec2 v_uv; uniform sampler2D mainTexture;
vec4 frag () { vec4 o = vec4(1, 1, 1, 1);
o *= texture(mainTexture, v_uv);
return CCFragOutput(o); } }%

8、在完成了 effect 之後,我們可以在編輯器中新建一個材質,在材質的 Effect 中選擇剛剛完成的 curved 之後傳入想要的貼圖,填入 dist 和 AllOffset 參數,保存之後將這個材質賦予剛剛提到的 plane 對象,調整參數可以看到我們的片面就能出現偏置效果了,移動攝像機可看到偏置效果是與頂點距離攝像機的距離相關的:

9、請注意,Shader 的參數與模型的尺寸是相關的,上圖所示效果是在 dist 為 100,AllOffset 的 Y 值為 10 時的效果,各位開發者可嘗試不同的組合來達到想要的效果。

10、似乎上圖的效果還不是太直觀,所以我用一些建築模型和一些路面模型簡單搭建了一段賽道來模擬遊戲可能會出現的場景。建議最好是能夠顯示出縱深效果的連續模型段,更能顯示出效果,當然這個效果並不只限於 Y 軸方向,還可以同時滿足 X 軸方向的偏置需求,下圖所示即為 Dist 為 100,X 為 -20,Y 為 -10 時的效果圖:

相信各位對 [ShaderToy] 並不陌生,之後我們將提供從 ShaderToy 中遷移 Shader 的方法,海量 Shader 等你來學習!目前在我們的[官方案例倉庫]的 demo02 中,已經實現了一個遷移好的場景案例(ShaderToy),感興趣的小夥伴們趕快去試試吧!

有很多小夥伴在社區分享了炫酷的材質效果,在這裡感謝 @yans 做出的分享,歡迎有想法的開發者多做分享,共同促進社區成長。

[LearnOpenGL]

https://learnopengl.com/Getting-started/Hello-Triangle

[材質系統]

https://docs.cocos.com/creator3d/manual/zh/material-system/overview.html

[官方案例倉庫]

https://github.com/cocos-creator/example-3d

[ShaderToy]

https://www.shadertoy.com/

 @yans 的分享

https://forum.cocos.org/users/yans/activity

以上就是我今天帶來的材質系統案例分享,希望通過這個簡單的案例為各位提供一個了解材質系統的入口。材質系統功能十分豐富,能夠實現的效果也是多種多樣的,各位快快打開腦洞,用 Cocos Creator 3D 來實現各種炫酷的效果吧!

歡迎小夥伴們繼續通過論壇、GitHub、Cocos 企業服務等渠道向我們提交 Cocos Creator 3D 使用反饋!

Cocos Creator 3D 下載:

https://www.cocos.com/creator3d

Cocos 中文社區:

https://forum.cocos.org/c/3D

3D  小遊戲案例  

我就知道你「在看」▼

相關焦點

  • 3D曲面印刷手機殼,擁有自主專利
    ,專業從事熱升華轉印基礎材料和3D立體熱升華轉印設備系統研究及提供對外加工服務。 本次測評產品——3D曲面印刷手機殼。 由科印自主研發的3D曲面印刷技術,比傳統UV列印,水貼及IMD等技術更加環保,同時兼併了客制化、色彩豔麗、清晰度高、曲麵包邊完美等全部優勢。
  • 【技巧】SolidWorks任意曲面的「包覆」特徵實現
    在圓柱面或者平面上我們可以用「包覆」命令來實現蝕刻和浮雕的效果,但是換成其他的不規則曲面或者球面,「包覆」命令就無能為力了
  • 中望3D"鑲嵌"快速解決曲面拉伸設計難題
    如果想在特徵面上進行拉伸,特徵面和基準面至少得是垂直或者水平的位置關係才可以實現,但要是曲面完全不符合上述的垂直或水平這兩個條件,怎麼辦?這種情況,相信設計師們在曲面進行拉伸在實際設計工作中會經常遇到,比如要在曲面上打公司LOGO、雕刻字體、做MARK印等等。圖1是筆者用中望3D做出來的一個曲面上拉伸實體的效果圖。
  • 到底該不該買曲面電視?優勢缺點在哪裡?
    對於漫天遍地的資訊,廣告,曲面電視僅僅是廠商們的噱頭嗎?到底該不該買曲面電視?什麼是曲面電視?曲面電視是指屏幕帶有一定曲率,擁有一定曲面形態的電視機,一般曲面電視的曲率與眼球弧度基本一致。曲面屏幕是一種採用柔性塑料的顯示屏,目前主要通過OLED面板來實現。相比直面屏幕,曲面屏幕彈性更好,不易破碎。
  • Cocos Creator 1.0 正式版發布 讓高效開發觸手可及
    後續我們會繼續推出像 PageView、ToggleButton 之類方便用戶使用的 UI 控制項,不過這些只需要實現 JavaScript 邏輯功能,通過 Cocos Creator 的組件系統開發者可以輕易做出自己的實現。
  • 曲面環繞 面面俱到,玻顯投影曲面大屏讓IMAX搬入客廳!
    TA,別具一格,極具誘惑TA,線條優美,體態動人TA,明亮多彩,豔麗奪目TA,突破所限,大有可能TA就是玻顯投影曲面大屏幕顯示系統把屏幕「掰彎」的弊端當然,有利就有弊,曲面大屏幕顯示系統也存在一些弊端需要解決。
  • 想買曲面電視?你需要先了解這 4 個問題|防被坑
    其是對傳統的CRT顯像管顯示技術的改進與升級,採用LCD技術的電視和顯示器,形狀更為輕薄,顯示效果也更為清晰銳利。LCD屏幕是一種傳統型液晶屏幕,不具有天然彎曲性,被稱為「物理曲屏」,因而此種材質大多被早期採用,而現在的廠商則更偏向於選擇柔性OLED屏幕。
  • 超寬曲面屏,體驗真香感覺~惠科HKC C299Q曲面屏顯示器
    之前朋友一直在耳邊嘮叨,曲面屏顯示器視野寬觀感好如如何如何的,我還心中納悶,習慣了正常的屏幕,曲面屏真的有那麼好嗎?直到這次體驗到惠科HKC C299Q曲面屏顯示器,我才真切的感受到「真香」二字!對於想要入手曲面屏的小夥伴,如下的體驗文章可以作為一個參考。產品採用白色硬紙盒包裝,包裝盒的左上角是HKC的logo標識,中央「C299Q」是產品的型號。
  • 使用CSS技術實現Netflix Logo動畫效果
    html 和 css 方便沒有使用過兩種技術的讀者閱讀)。正如你所看到的,當這個陰影到達右下角,3d 效果的消失點在中間。現在知道我們函數需要做什麼了。animation-name: pop-out, fade-back, change-color;animation-duration: 4s, 2s, 0.1s;animation-delay: 0s, 2s, 3.2s上面的代碼只是一個近似的實現,每個字母有不同的動畫延遲和間隔,可以點擊這裡查看最終的實現效果。
  • SOLIDWORKS Visualize 外部導入材質貼圖探究
    序言:在SOLIDWORKS Visualize渲染過程中,有些時候我們需要把真實的外觀紋理導入到Visualize材質中,以便得到更加真實的渲染效果。較耗時耗力耗資源2.Visualize渲染進行產品推廣我們可以把3d數據導入到SOLIDWORKS Visualize中對其進行方案展示,得到逼真結果,那麼在這個過程中最重要的一個環節就是紋理的添加,我們如何做到將樣品紋理導入到visualize材質中呢,從而得到下圖的宣傳效果呢
  • 重蹈3D電視覆轍,曲面電視曇花一現?
    中怡康數據顯示,2017年第一季度全渠道曲面電視在型號共355款,超過超薄、分體、無邊框電視在售款數之和,全渠道曲面電視零售量同比增長123.2%,線下曲面電視零售量滲透率達到11.1%。有意思的是,主流彩電廠商卻從今年開始對曲面電視「輕描淡寫」,在春季新品發布會上,除三星外,幾乎不提曲面概念,長虹等曾經是曲面電視的主力廠商今年甚至沒有曲面電視新品。
  • Google Earth 是怎麼實現 3D 效果的?
    2021年距離 Google Earth 第一版發布已經 16 年了, 如今的 Google Earth 已經有非常不錯的 3D 效果, 在許多地區都能提供無人機視角一樣的體驗
  • 曲面側屏+2K 三星Note4、Note Edge全面評測
    全球首款曲面側屏手機三星GALAXY Note Edge系統界面如曲面側屏上無需解鎖即可預覽信息,可實現設置獨立壁紙,還可實現一些小功能,如尺子,計時器、時鐘等等。以及快速進入常用應用、查看提醒和設備功能。在主屏幕觀看視頻時,用戶還可以直接通過側屏接收各種信息,而無需暫停視頻播放。且曲面部分還可以作為一個附加菜單,進行多種功能的定製。同時,曲面部分也將會開放SDK給開發者以實現更多功能。
  • ai+3d列印的三維農業生產數據監測系統
    ai+3d列印的三維農業生產數據檢測系統。它是由湖南智慧農業聯盟聯合湖南廣播電視大學、藍州天生科技共同打造的三維創新型農業產業生產信息系統。通過3d列印的立體智慧農業生產數據檢測系統,有效的預警農業問題,如病蟲害,營養消耗過快,農藥殘留超標,肥料使用過量等問題,從對接,代理商和經銷商對接,農業專業人員協助監督,品牌推廣,合作機構之間互聯互通,形成農業生產、農產品品牌的建設。
  • 最新3D LUT Creator調色軟體!號稱調色終極殺器!
    軟體介紹▼最新3D LUT Creator調色軟體系統:win(漢化版)界面介紹▼3D LUT Creator 1.44漢化版的多數功能在PS中實現,但其優點在於操作方便,免去了在PS中切換顏色空間和應用各種
  • Unity中實現2D光照系統
    2D 光影效果需要一個動態光照系統實現, 而通常遊戲引擎所提供的實時光照系統僅限於 3D 場景,要實現圖中效果的 2D 光影需要額外設計適用於 2D 場景的光照系統。雖然在 Unity Assets Store 上有不少 2D 光照系統插件,實際上實現一個 2D 光照系統並不複雜, 並且可以藉此機會熟悉 Unity 渲染管線開發。本文將介紹通過 Command Buffer 擴展 Unity Built-in Render Pipeline 實現一個簡單的 2D 光照系統。
  • Github霸榜:從零開始學3D著色器編程
    坐標系統開始插手著色器代碼之前,需要對3D物體的坐標系統有所了解。渲染到紋理渲染到紋理(Render To Texture, RTT)是現在很多特效裡面都會用到的一項很基本的技術,實現起來很簡單,也很重要。渲染到紋理是為了實現一些特殊的效果,比如一個光滑的球體,它應該是可以反射周圍環境的,這個時候就需要先渲染到紋理。
  • Cocos Creator v2.1.2 正式發布
    Cannot convert undefined or null to object」 報錯的問題修復導入 plist 圖集時,部分 Sprite 的 offset 會被取整導致的渲染問題修復 circle collider 的 gizmo 相關問題修復 VideoPlayer 和 WebView 在編輯器中顯示不正確的問題修復渲染組件無法保存自定義材質的問題
  • 巧用C4D倒角工具製作曲面硬邊挖洞效果
    你們在工作中也許經常會遇到需要製作下面這種曲面硬邊挖洞的效果,如果不進行合理布線的話,添加細分曲面四個角就會變成圓角
  • 3d動漫是怎麼製作的
    現在3d技術發展迅速,平均每上映的三部動畫裡就有一部是3d動畫,那麼這個動畫到底是怎麼做出來的?怎麼樣才能get這項技能呢?模型要簡潔高效,不能有多餘的點線面,不然會影響之後的材質和渲染。3、綁定和蒙皮給角色模型建立、綁定骨骼,蒙皮,刷權重,做曲線控制器。先建立人物的骨骼,骨骼和各種控制點做好之後做蒙皮。4、動畫根據前期錄的音,給相應角色調口型,根據前期的分鏡建立鏡頭和建模的場景、道具模型,糾正角色的動作,再發揮想像給角色們加戲,加隨動,加表情。