效果如下。
很簡單,核心**就下面這兩句。原理就是通過計算當前uv與中心的距離是否在內環(_innerradius)和外圓(_outerradius)之間,若是,則將透明度置為1,若不是,則將透明度置為0。
fixed dis =
distance
(in.texcoord,
fixed2
(0.5
,0.5))
;color.a =
step
(_innerradius, dis)
*step
(dis, _outerradius)
;
**中沒有使用if…else…來判斷,而是使用了兩個step方法,這有助於提公升效能。
// 這段**沒有上面使用step的方式效率高
fixed dis =
distance
(in.texcoord,
fixed2
(0.5
,0.5))
;if(dis >= _innerradius && dis <= _outerradius)
else
至於為什麼step比if…else效率更高,可參考這兩篇文章。
《unity shader: 優化gpu**–用step()代替if else等條件語句》
《深入gpu硬體架構及執行機制》
完整**如下。
新建個材質,材質指定該shader,然後將材質球拖拽到image上面,效果就顯示出來了。
。shader "custom/ui/circle"
_color (
"tint"
, color)=(
1,1,
1,1)
_outerradius (
"outer radius"
,range(0
,0.5))
=0.5
_innerradius (
"inner radius"
,range(0
,0.5))
=0.2
_stencilcomp (
"stencil comparison"
, float)=8
_stencil (
"stencil id"
, float)=0
_stencilop (
"stencil operation"
, float)=0
_stencilwritemask (
"stencil write mask"
, float)
=255
_stencilreadmask (
"stencil read mask"
, float)
=255
_colormask (
"color mask"
, float)=15
[toggle
(unity_ui_alphaclip)
] _useuialphaclip (
"use alpha clip"
, float)=0
} subshader
stencil
cull
offlighting
offzwrite
off ztest [unity_guiztestmode]
blend
srcalpha
oneminussrcalpha
colormask [_colormask]
pass
;struct v2f
; sampler2d _maintex;
fixed4 _color;
fixed4 _texturesampleadd;
float4 _cliprect;
float4 _maintex_st;
fixed _outerradius;
fixed _innerradius;
v2f vert
fixed4 frag
(v2f in)
: sv_target
endcg
}}}
Unity3D Shader系列之幾何著色器基礎
最近一直在練習寫shader,發現用幾何著色器可以寫出特別酷炫的效果。於是去學習了一下,這裡做個總結以備查閱。幾何著色器位於渲染流水線的幾何階段,在頂點著色器與片元著色器之間。備註 於馮樂樂的 unity shader入門精要 p9 其在shader中是可選的,完全可程式設計的。頂點著色器是以頂點資...
Unity3d Shader 運動模糊
攝影常用的一招就是延時攝影,以使運動的物體產生運動模糊。攝影技巧為 1,三角架固定相機 2,調長 時間 3,物件有運動物體和靜止物體參照 用了延時攝影,會產生藝術感,見下圖 2015年1月 拍攝於上海陸家嘴 遊戲方面可喜的是unity3d也可以實現類似效果,先看效果圖 第一張為無運動模糊 第二張為有...
Unity3D Shader 入門學習
unity3d 的所有渲染工作離不開著色器.shader 著色器其實是一小段程式,它負責將輸入的mesh網格.以指定的方式和輸入的貼圖或者顏色等組合作用.然後輸出.繪圖單元可以依據這個輸出來將影象繪製到螢幕上 輸入的貼圖或顏色等,加上對應的shader,以及對shader的特定引數設定,將這些內容 ...