【Unity Shaders】Transparency —— 透明的cutoff shader

本系列主要參考《Unity Shaders and Effects Cookbook》一書(感謝原書作者),同時會加上一點個人理解或拓展。

這里是本書所有的插圖。這里是本書所需的代碼和資源(當然你也可以從官網(wǎng)下載)。
========================================== 分割線 ==========================================

寫在前面

啦啦啦,終于畢業(yè)啦
大笑

~上個月上任了游戲版版主,感覺在畢業(yè)前的一個月又給自己找了不少事。自己還是小白菜多少感覺有點壓力大呀,自己能力有限,希望在幫助別人的同時,也能讓自己多多收獲吧!

呼呼,上個月畢設答辯、考試、論壇、畢業(yè)手續(xù)一大堆事向我襲來,導致有點荒廢了Shader學習。。。這個月開始放假啦,要再接再厲!

這一篇里接著學透明度。在上一篇里,我們講到在Shader的#pragma聲明中添加alpha參數(shù)來實現(xiàn)透明效果真的是非常方便。事實上,Unity還提供了另一種參數(shù)來實現(xiàn)一個更簡單的透明效果,叫做cutoff transparency,是不是很耳熟?這種類型的透明效果使用一個變量來簡單地控制哪些像素不要畫在屏幕上。因此,cutoff transparency使得我們可以得到要么全透明效果,要么不透明的效果。而在上一篇中,我們可以控制所有范圍的灰度值來影響透明度,也被稱為半透明效果。

準備工作

首先創(chuàng)建一個新的場景,和一個新的球體和平行光。
創(chuàng)建新的Shader和Material,可以命名為CutoffShader。
把Shader賦給Material,再把Material賦給球體。
選擇一張貼圖。最好是一張灰度圖,這樣你可以看到cutoff的效果。

實現(xiàn)

首先在Properties塊增加新的浮點值,它將允許我們選擇中斷值(cutoff value):[plain] view plain copy
print?

派生到我的代碼片
派生到我的代碼片

Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cutoff ("Cutoff Value", Range(0,1)) = 0.5
}

然后,告訴Shader我們將把這個Shader設置成cutoff類型:[plain] view plain copy
print?

派生到我的代碼片
派生到我的代碼片

CGPROGRAM

pragma surface surf Lambert alphatest:_Cutoff

最后,使用貼圖中我們希望使用的通道值來填充o.Alpha。[plain] view plain copy
print?

派生到我的代碼片
派生到我的代碼片

void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.g;
}

使用不同_Cutoff值得到的結果(從左到右依次增大):

解釋

Unity給我們提供了相當一些在#pragma指令中可以使用的參數(shù)。它們給我們提供了強大的能力來改變和優(yōu)化我們的Surface Shader。這正是在編寫Shader以及迭代化處理時,Surface Shader如此強大和有效的原因之一。

我們的cutoff shader在#pragma指令中使用了一個新的參數(shù),名為alphatest:VariableName。這個參數(shù)將我們的Shader設置為一個簡化版本的透明度。和半透明度效果(灰度值范圍內的每一個值都講影響透明度)不同,只有_Cutoff變量控制最終的透明效果。這意味著,如果我們讓_Cutoff值為0.4,那么任何灰度值低于0.4的值會被認為是透明的,而高于0.4的值被認為是不透明的。

使用這種類型的透明效果的好處是可以提高性能。之前的半透明效果的性能耗費要高于cutoff類型。但是,在移動設備上是正好相反的,這是因為對于這些小型的GPUs來說,檢查一張貼圖中的每一個像素值是非常耗性能的。因此,如果你正在用Unity開發(fā)一款移動應用,那么盡量使用半透明技術,而少使用本篇提到的cutoff透明技術。

呼呼,以后要驗證一下是不是真的在移動設備上反而效率更低了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • <轉>我也忘了轉自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對3D對象進行操作...
    星易乾川閱讀 5,846評論 1 16
  • Unity shader 官網(wǎng)文檔全方位學習(一)What?? Shader,看起來好高級的樣子,是的,這是Uni...
    狼之獨步閱讀 6,277評論 0 12
  • 右手的花 左手的他 挽住的是愛情 情到濃時 心會失守 吻住的是愛情 枝上多彩的燈 映紅了你的臉龐 只看了一眼 噢 ...
    孟曰娶一閱讀 168評論 0 0
  • 得了一種卡文就想寫段子的病。全是私設。 幫主的腳在地上一點一點,心不在焉地解說著比賽。旁邊二龍看到場上一局結束,瞥...
    檀司青閱讀 194評論 0 0
  • 在這樣一個階段 一個逐漸轉暖的傍晚 沒有似錦繁華 更沒有鮮明的愛恨 回憶曾經(jīng)疼痛的齒痕 自嘲自諷像點碎浮夸的泡沫 ...
    白蕙僑閱讀 506評論 0 1

友情鏈接更多精彩內容