零蔬啡、這個時代诲侮,太快
如果有朋友年齡和麒麟子相仿的話,小時候應該玩過DVD播放機箱蟆,就下面圖里這東西沟绪。
那么問題來了,你還記得空猜,如果想要播放自己想看的內容绽慈,一共分幾步嗎恨旱?
和把大象裝進冰箱一樣簡單,只需要三步:
第一步坝疼、出倉:彈出光盤托盤
第二步搜贤、換碟:把想放的光碟放進去
第三步、關倉:收回光盤托盤
如果我們想從劉德華的專輯切換到張學友的專輯钝凶,你需要重復上面的步驟仪芒。
如果我們想從聽歌切換到某電影,你需要重復上面的步驟耕陷。
如果我們想從電視劇的某一集切換到另一集掂名,你還是需要重復上面的步驟。
現(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
制服罚攀?統(tǒng)一的?似乎都不對雌澄。
Uniform
是GLSL
的關鍵字斋泄,當我們需要從外部傳遞參數(shù)給GLSL
時,就需要申明一個uniform
常量镐牺。比如 uniform
炫掐、float
、time
麒麟子覺得睬涧,
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
請看上圖的示例
Cocos Shader要求脱盲,常量需要定義在uniform-block
中邑滨,麒麟子就直接翻譯成常量塊
了。
不用去管為什么钱反,先記住就行掖看。
我們定義了一個vec4 mainColor
和一個vec4 colorScaleAndCutoff
其中mainColor
用于物體渲染時的顏色值r,g面哥,b哎壳,a
通道都用上
而colorScaleAndCutoff
中,colorScaleAndCutoff.rgb
用于顏色因子調子尚卫,而colorScaleAndCutoff.w
用于Alpha測試判斷归榕。
Alpha測試后面會講,這里我們暫時忽略它吱涉。
渲染效果如下刹泄,由于我們沒有設置變量值,常量的默認值是0.0怎爵,所以會渲染出黑色特石。
四、通過代碼控制Uniform參數(shù)
為了照顧大家迫切的心情鳖链,我們先看看如何使用代碼控制常量吧县匠。
其實使用代碼控制常量非常簡單。
1撒轮、新建一個TS腳本
麒麟子把腳本取名為MaterialCtrl.ts
然后寫上下面這樣的代碼乞旦。
這么少的代碼,大家手抄吧题山。
2兰粉、將MaterialCtrl.ts
掛在了球體上。
3顶瞳、啟動瀏覽器預覽
在瀏覽器中玖姑,你就能看到一個紫色的球。
注意:在編輯器中是看不到紫色的慨菱,因為我們需要TS代碼行執(zhí)行起來才行焰络。
五、通過屬性面板(Inspector)控制Uniform參數(shù)
有的朋友應該發(fā)現(xiàn)了符喝,剛剛我們添加的mainColor
和 colorScaleAndCutoff
并沒有出現(xiàn)在Inspector面板里闪彼。
接下來我們就來看看,如何將一個uniform
顯示在面板上。
在cocos-shader-helloworld.effect
中畏腕,我們添加上圖紅框部分的代碼缴川。再次回到編輯器,就可以看見材質面板上多出了mainColor
和colorScale
兩個調節(jié)參數(shù)描馅。
通過調節(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
:用于指定需要使用的變量,在這里嫂丙,我們使用colorScaleAndCutoff
的xyz
三個通道娘赴。
掌握了上面的知識,足夠滿足日常Shader編寫的需求跟啤。如果需要進一步研究的朋友诽表,可以查看官方文檔Pass Params
對應部分。如下圖所示:
六隅肥、需要注意的點
一竿奏、
mainColor
可以通過Color
設置,也可以通過vec4
設置腥放。在Cocos代碼中泛啸,Color
和vec4
有一個差別,就是Color
的分量是按0~255取值的秃症,注意這個細節(jié)就行候址。
二、在使用代碼設置材質時种柑,請注意
target.sharedMaterial
和target.material
的區(qū)別岗仑。
target.sharedMaterial
會直接對材質進行設置,所有引用同一個材質文件的對象均會受到影響聚请。
target.material
若未復制荠雕,則target.material
會先復制一個sharedMaterial
材質,再進行操作。這樣設置后舞虱,不會對其他對象造成影響欢际,但會影響GPU Instancing
等優(yōu)化效果母市。使用的時候要慎重矾兜。
三、使用代碼控制材質患久,編輯器中看不到效果椅寺,需要運行后查看。
四蒋失、在使用代碼設置時返帕,對于像示例中
colorScale
這樣的定義,我們既可以對colorScaleAndCutoff
進行整體設置篙挽,也可以單獨對colorScale
進行設置荆萤。換句話說,setProperty
方法既能識別Shader
中的uniform
定義铣卡,也能識別Pass
描述中的屬性定義.
七链韭、總結
本文從uniform
含義和用途解釋了uniform
存在的意義。
并以mainColor
和colorScale
兩個uniform
實例演示了如何在Cocos Shader中使用uniform
煮落。
與此同時敞峭,也展示了如何通過代碼進行uniform
操控。
在掌握本文的內容后蝉仇,朋友們應該對Cocos Shader
的使用流程有了整體認識旋讹。
后面的內容雖然多,但已經(jīng)不再有流程上的新增轿衔,只是內容會更豐富沉迹。
能走到這里的朋友已經(jīng)很厲害了,悄悄告訴你害驹。
離渲染出美妙的花花世界胚股,只有一步之遙。
八裙秋、預告
下一篇文章 《Cocos Shader入門基礎五:是紋理給了你這個花花世界》 中琅拌,麒麟子將會給大家介紹紋理相關知識。
- 紋理坐標
UV
是什么摘刑? - 紋理類型
- 紋理尋址方式
- 紋理采樣方式
- 定義一個類型為
smapler2D
的uniform