本文轉(zhuǎn)自Unity Connect博主 汪汪
從實(shí)踐來(lái)認(rèn)識(shí)shaderlab編程
寫(xiě)這篇文章呢,主要是為了讓想學(xué)習(xí)shaderlab編程的小伙伴們迅速了解shaderlab的的基本語(yǔ)法,和運(yùn)用基本語(yǔ)句來(lái)實(shí)現(xiàn)一些簡(jiǎn)單的材質(zhì)效果和動(dòng)畫(huà)。由于是實(shí)踐入門(mén),嘛,理論就會(huì)很少,偏向于出效果,更多的是從例子來(lái)一步一步的解析,理解,直到融會(huì)貫通。如果想深入學(xué)習(xí)的小伙伴,需要多多自己鉆研,查閱資料哦。
雖然本文不偏向于理論,但是基本的常識(shí)性問(wèn)題希望大家了解。
編寫(xiě)shader目前主流的三種高級(jí)語(yǔ)言有:HLSL、GLSL、CG
HLSL由微軟推出,基于DirectX,全名High Level Shading Language
GLSL則基于OpenGL,全名OpenGL Shading Language
CG由Nvidia推出,全名C for Graphic
Shader 是Material的一部分,Material是Shader,紋理,顏色等的集合
Shader在GPU中運(yùn)行
ShaderLab是由Unity封裝,兼容Unity的著色器語(yǔ)言
目前 Unity 下 Shader 的分類有三種,surface shaders,vertex and fragment shaders 、fixed function shaders。
本汪將側(cè)重,或者只使用vertex and fragment shaders來(lái)進(jìn)行案例的講解
Hello Shader!
就像我們學(xué)習(xí)第一門(mén)編程一樣,我們應(yīng)該友好的對(duì)Shaderlab說(shuō)一句:Hello!
我們從Unity中創(chuàng)建一個(gè)Unlit(不受光)模板看一下
“ ??汪汪你什么意思,一來(lái)就給我看這么多代碼,不是說(shuō)給想了解shaderlab的同學(xué)看嗎?這么多我看得懂啊??”
這。。。別急,別急,看本汪對(duì)上面的代碼進(jìn)行瘦身!
我們逐一來(lái)分析:
首先是
Shader"WangWang/HelloShader"
上面我已經(jīng)注釋了,是對(duì)shader進(jìn)行分組和取名,如果按照上圖中的設(shè)定,那么在Unity里就會(huì)有如下效果哦:
在材質(zhì)的shader選項(xiàng)里,出現(xiàn)了一個(gè)Wangwang的分組,接下來(lái)是HelloShader的材質(zhì)名字
Properties{}
我們可以在函數(shù)體中,聲明我們向外暴露的一些參數(shù),比如貼圖啊,顏色啊,數(shù)值啊等。
下面我們?cè)诤瘮?shù)體中添加如下代碼:
--------------------------------------------------------------------------
Properties
? ? {
//在此聲明屬性
_BaseTex("MainTextrue",2D)="black"{}
? ? }
--------------------------------------------------------------------------
編譯成功后,我們查看一下結(jié)果:
出現(xiàn)了一張自定義貼圖選項(xiàng)欄!!
名字是:MainTextrue
我們可以這樣理解下面的代碼
_BaseTex("MainTextrue",2D)="black"{}
**聲明了一個(gè)叫做_BaseTex的腳本內(nèi)變量,并向外暴露,暴露出來(lái)的是一個(gè)“2D”類型的變量類型,名字叫做“MainTextrue”,如果沒(méi)有給接口賦予任何貼圖,則默認(rèn)為黑色。
SubShader{}
上文中我們提到,編寫(xiě)shader可以有多種語(yǔ)言,然而這些語(yǔ)言其實(shí)是有局限性的。
HLSL只能運(yùn)行在支持DirectX的的平臺(tái)
GLSL只能運(yùn)行在支持OpenGL的平臺(tái)
嘛,就是說(shuō)他們兩個(gè)誰(shuí)都不喜歡誰(shuí),都不想和對(duì)方說(shuō)話,所以無(wú)法溝通呢。≡(▔﹏▔)≡
在這里如果是針對(duì)多個(gè)平臺(tái),多個(gè)硬件來(lái)編寫(xiě)的shader,就很有可能需要多個(gè)SubShader哦。
如果顯卡1不支持第一個(gè)SubShader中的代碼,那么就會(huì)跳到第二個(gè)Subshader中執(zhí)行哦。就這樣跳跳跳跳~
萬(wàn)一都不支持怎么辦呢?
Fallback“Shader名”
這就是我們最后登場(chǎng)的角色,如果沒(méi)有任何一個(gè)Subshader是支持這個(gè)硬件的,那就會(huì)調(diào)用Fallback后面的shader。通俗的說(shuō)呢,就是!!
備胎吧。
最后一個(gè)Pass因?yàn)槭侵攸c(diǎn)內(nèi)容,這里一篇文章講不完,會(huì)在后續(xù)詳細(xì)介紹。
好啦,本期shaderlab實(shí)踐就到這里了,汪汪本人也是屬于學(xué)習(xí)階段,如果不足,錯(cuò)誤之處,希望大家海涵。
原文鏈接:https://connect.unity.com/p/shaderlab-ru-men-shi-jian?app=true
歡迎戳上方原文鏈接,下載Unity官方技術(shù)社區(qū)app,在線技術(shù)答疑,發(fā)現(xiàn)更多資源干貨!