Cocos Shader入門基礎四:Uniform與材質參數(shù)控制

image

零蔬啡、這個時代诲侮,太快


如果有朋友年齡和麒麟子相仿的話,小時候應該玩過DVD播放機箱蟆,就下面圖里這東西沟绪。

image

那么問題來了,你還記得空猜,如果想要播放自己想看的內容绽慈,一共分幾步嗎恨旱?

和把大象裝進冰箱一樣簡單,只需要三步:

第一步坝疼、出倉:彈出光盤托盤

第二步搜贤、換碟:把想放的光碟放進去

第三步、關倉:收回光盤托盤

如果我們想從劉德華的專輯切換到張學友的專輯钝凶,你需要重復上面的步驟仪芒。

如果我們想從聽歌切換到某電影,你需要重復上面的步驟耕陷。

如果我們想從電視劇的某一集切換到另一集掂名,你還是需要重復上面的步驟。

現(xiàn)在讓你這樣去播放節(jié)目哟沫,你肯定會覺得煩饺蔑。

因為我們已經(jīng)習慣了當下更先進的計算機系統(tǒng)和功能強大的多媒體軟件。

不再需要從成堆的光碟中去尋找想要的內容嗜诀。

不再需要從舒適的沙發(fā)里起身去更換想要播放的光碟膀钠。

不再需要擔心心愛的光碟損壞或者被鄰家王哥哥借走。

麒麟子學Shader也經(jīng)歷了類似的時代跨度裹虫。

80后嘛肿嘲,總是免不了處于時代交叉口的命運。

十幾年前筑公,人們發(fā)現(xiàn)固定渲染管線(Fixed Render Pipeline)難以滿足日益增長的畫面要求雳窟,可編程渲染管線(Programmable Render Pipeline)應運而生。

可編程管線需要硬件支持匣屡,由于硬件更新的成本遠遠大于軟件成本封救,普及速度并不能像軟件那樣快。

處于時代交替的3D引擎捣作,為了兼顧所有用戶的需求誉结,一般都會支持固定管線可編程管線

那處于時代交叉口的程序員券躁,別無選擇惩坑,要同時掌握固定管線可編程管線,才能吃飽飯也拜。

早期的可編程程管線就是在固定管線的基礎上以舒,將T&L(變換與光照)以Vertex Shader方式呈現(xiàn),而紋理采樣和混合則以Fragment Shader方式呈現(xiàn)慢哈。

隨著固定管線的淘汰蔓钟,可編程管線不再考慮兼容前者,如今的可編程管線不管是從功能性還是便利性而言卵贱,早已經(jīng)是當初的版本無法比擬的了滥沫。

為什么麒麟子要浪費大量篇幅來講這個侣集。

享受當下,暢想未來兰绣,回顧歷史肚吏,可以讓我們生活的充滿詩意。

一狭魂、什么是Uniform


image

制服罚攀?統(tǒng)一的?似乎都不對雌澄。

UniformGLSL的關鍵字斋泄,當我們需要從外部傳遞參數(shù)給GLSL時,就需要申明一個uniform常量镐牺。比如 uniform炫掐、floattime

麒麟子覺得睬涧,Direct3D中的稱呼更確切募胃,它叫 constant, 常量。

它有兩個特點

  • 可以通過圖形API(如D3D畦浓、OpenGL痹束、WebGL)修改
  • Shader內不可以修改

這也是為什么Direct3D要把它叫做常量

常量的傳遞需要使用GPU中的常量寄存器,顯然顯卡寄存器并非是一個無限資源讶请。

我們可以通過GL的枚舉來查看限制祷嘶。

頂點著色器常量數(shù)量限制:GL_MAX_VERTEX_UNIFORM_COMPONENTS

像素著色器常量數(shù)量限制:GL_MAX_FRAGMENT_UNIFORM_COMPONENTS

好在,這些限制都比較大夺溢,對于日常開發(fā)论巍,我們可以暫時不關注這個問題。

如果哪天遇上特殊需求风响,請記得嘉汰,硬件資源不是無限的。

二状勤、Cocos Shader中的Uniform


在Cocos中鞋怀,我們可以使用如下常量類型

bool int float vec2 vec3 vec4

除了聲明單個常量之外,我們還可以聲明常量數(shù)組荧降。

比如接箫,引擎中的骨骼動畫(在不使用頂點紋理的情況下)攒读,需要將整個骨骼矩陣傳遞過來朵诫,此時就需要用到數(shù)組。

接下來薄扁,我們將在通過在Cocos Shader中添加變量的方式剪返,一步步讓大家掌握Cocos Shader中uniform的使用废累。

三、第一個Uniform


image

請看上圖的示例

Cocos Shader要求脱盲,常量需要定義在uniform-block中邑滨,麒麟子就直接翻譯成常量塊了。

不用去管為什么钱反,先記住就行掖看。

我們定義了一個vec4 mainColor和一個vec4 colorScaleAndCutoff

其中mainColor用于物體渲染時的顏色值r,g面哥,b哎壳,a通道都用上

colorScaleAndCutoff中,colorScaleAndCutoff.rgb用于顏色因子調子尚卫,而colorScaleAndCutoff.w用于Alpha測試判斷归榕。

Alpha測試后面會講,這里我們暫時忽略它吱涉。

渲染效果如下刹泄,由于我們沒有設置變量值,常量的默認值是0.0怎爵,所以會渲染出黑色特石。

image

四、通過代碼控制Uniform參數(shù)


為了照顧大家迫切的心情鳖链,我們先看看如何使用代碼控制常量吧县匠。

其實使用代碼控制常量非常簡單。

1撒轮、新建一個TS腳本

麒麟子把腳本取名為MaterialCtrl.ts 然后寫上下面這樣的代碼乞旦。

image

這么少的代碼,大家手抄吧题山。

2兰粉、將MaterialCtrl.ts掛在了球體上。

3顶瞳、啟動瀏覽器預覽

image

在瀏覽器中玖姑,你就能看到一個紫色的球。

image

注意:在編輯器中是看不到紫色的慨菱,因為我們需要TS代碼行執(zhí)行起來才行焰络。

五、通過屬性面板(Inspector)控制Uniform參數(shù)


有的朋友應該發(fā)現(xiàn)了符喝,剛剛我們添加的mainColorcolorScaleAndCutoff并沒有出現(xiàn)在Inspector面板里闪彼。

接下來我們就來看看,如何將一個uniform顯示在面板上。

image

cocos-shader-helloworld.effect中畏腕,我們添加上圖紅框部分的代碼缴川。再次回到編輯器,就可以看見材質面板上多出了mainColorcolorScale兩個調節(jié)參數(shù)描馅。

image

通過調節(jié)面板把夸,我們就能在編輯器里看到直接的效果變化,是不是很棒铭污?

麒麟子逐一解釋一下各個部分的含義恋日。

mainColor: { value: [1, 1, 1, 1], editor: { type: color } }

mainColor:是顯示在面板上的屬性名稱,這個名稱直接與下面的uniform Constant中的 vec4 uniform自動匹配嘹狞。

value:默認值

editor:用于配置編輯器面板相關參數(shù)谚鄙,比如 type則用于指定面板顯示內容。如果不指定刁绒,mainColor將默認以vec4顯示闷营。

這里我們希望mainColor是一個顏色,所以我們指定為color

colorScale: { value: [1, 1, 1], target: colorScaleAndCutoff.xyz }

colorScale:是屬性名稱知市,它將顯示在面板上傻盟。

value:默認值

target:用于指定需要使用的變量,在這里嫂丙,我們使用colorScaleAndCutoffxyz三個通道娘赴。

掌握了上面的知識,足夠滿足日常Shader編寫的需求跟啤。如果需要進一步研究的朋友诽表,可以查看官方文檔Pass Params對應部分。如下圖所示:

image

六隅肥、需要注意的點


一竿奏、mainColor可以通過Color設置,也可以通過vec4設置腥放。在Cocos代碼中泛啸,Colorvec4有一個差別,就是Color的分量是按0~255取值的秃症,注意這個細節(jié)就行候址。

二、在使用代碼設置材質時种柑,請注意target.sharedMaterialtarget.material的區(qū)別岗仑。

target.sharedMaterial會直接對材質進行設置,所有引用同一個材質文件的對象均會受到影響聚请。

target.material 若未復制荠雕,則target.material會先復制一個sharedMaterial材質,再進行操作。這樣設置后舞虱,不會對其他對象造成影響欢际,但會影響GPU Instancing等優(yōu)化效果母市。使用的時候要慎重矾兜。

三、使用代碼控制材質患久,編輯器中看不到效果椅寺,需要運行后查看。

四蒋失、在使用代碼設置時返帕,對于像示例中colorScale這樣的定義,我們既可以對colorScaleAndCutoff進行整體設置篙挽,也可以單獨對colorScale進行設置荆萤。換句話說,setProperty方法既能識別Shader中的uniform定義铣卡,也能識別Pass描述中的屬性定義.

七链韭、總結


本文從uniform含義和用途解釋了uniform存在的意義。

并以mainColorcolorScale兩個uniform實例演示了如何在Cocos Shader中使用uniform煮落。

與此同時敞峭,也展示了如何通過代碼進行uniform操控。

在掌握本文的內容后蝉仇,朋友們應該對Cocos Shader的使用流程有了整體認識旋讹。

后面的內容雖然多,但已經(jīng)不再有流程上的新增轿衔,只是內容會更豐富沉迹。

能走到這里的朋友已經(jīng)很厲害了,悄悄告訴你害驹。

離渲染出美妙的花花世界胚股,只有一步之遙。

八裙秋、預告

image

下一篇文章 《Cocos Shader入門基礎五:是紋理給了你這個花花世界》 中琅拌,麒麟子將會給大家介紹紋理相關知識。

  • 紋理坐標UV是什么摘刑?
  • 紋理類型
  • 紋理尋址方式
  • 紋理采樣方式
  • 定義一個類型為smapler2Duniform

關注麒麟子进宝,閱讀更多精彩文章


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枷恕,隨后出現(xiàn)的幾起案子党晋,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件未玻,死亡現(xiàn)場離奇詭異灾而,居然都是意外死亡,警方通過查閱死者的電腦和手機扳剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門旁趟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庇绽,你說我怎么就攤上這事锡搜。” “怎么了瞧掺?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵耕餐,是天一觀的道長。 經(jīng)常有香客問我辟狈,道長肠缔,這世上最難降的妖魔是什么投剥? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任取募,我火速辦了婚禮日裙,結果婚禮上譬巫,老公的妹妹穿的比我還像新娘沛励。我一直安慰自己帖烘,他們只是感情好逾柿,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布倍奢。 她就那樣靜靜地躺著庶溶,像睡著了一般煮纵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偏螺,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天行疏,我揣著相機與錄音,去河邊找鬼套像。 笑死酿联,一個胖子當著我的面吹牛,可吹牛的內容都是我干的夺巩。 我是一名探鬼主播贞让,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柳譬!你這毒婦竟也來了喳张?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤美澳,失蹤者是張志新(化名)和其女友劉穎销部,沒想到半個月后摸航,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舅桩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年酱虎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擂涛。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡读串,死狀恐怖,靈堂內的尸體忽然破棺而出歼指,到底是詐尸還是另有隱情爹土,我是刑警寧澤甥雕,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布踩身,位于F島的核電站,受9級特大地震影響社露,放射性物質發(fā)生泄漏挟阻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一峭弟、第九天 我趴在偏房一處隱蔽的房頂上張望附鸽。 院中可真熱鬧,春花似錦瞒瘸、人聲如沸坷备。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽省撑。三九已至,卻和暖如春俯在,著一層夾襖步出監(jiān)牢的瞬間竟秫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工跷乐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肥败,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓愕提,卻偏偏與公主長得像馒稍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浅侨,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容