shader "unlit/stentiloutline"
_outline
("outline"
,range(0
,1))
=0} subshader
lod 100
stencil
pass ;
struct v2f
;sampler2d _maintex;
float4 _maintex_st;
fixed4 frag (v2f i)
: sv_target
endcg
} pass
;struct v2f
; sampler2d _maintex;
float4 _maintex_st;
fixed _outline;
fixed4 frag (v2f i)
: sv_target
endcg}}}
這個案例是拷貝過來的,用來做描邊功能
stencil的預設值是0,而buffer的值在當前幀結束前是不清除的,所以它可以跨越不同的shader與pass。stencil結構寫在subshader中,那麼下面的所有pass中的stencil test都按此執行。理想環境下,第乙個pass渲染前螢幕上所有畫素的stencil值都是0,在該pass fragment shader片段作色器結束後,所有進行了渲染的畫素stencil值都變為了1。
要點:stencil寫在pass外面,每個pass都會執行stencil一遍
效果:
這是用兩個shader來實現,球的shader跟兩個膠囊體
**如下:
膠囊體(先渲染geometry+1):
shader "soulcoder/mask"
colormask 0
zwrite off
stencil
cginclude
float4 vertex : position;};
struct v2f
; v2f vert
half4 frag
(v2f i)
: sv_target
endcg
pass
pass
}}
球體(後渲染geometry+2):
shader "soulcoder/model"
subshader
colormask rgb
cull front
ztest always
stencil
cgprogram
#pragma su***ce surf lambert
float4 _color;
struct input
;void surf (input in, inout su***ceoutput o)
endcg}}
分析:第乙個shader因為colormask 0,所以不輸出顏色,然後把其渲染的範圍模板值寫入1
第二個shader的ref值為0,因為上乙個shader pass完後,膠囊體的範圍緩衝區的ref是1,所以球體跟膠囊體公共的區域,ref1不等於ref0,公共區域不滿足comp equal ,所以丟棄片元,但是背景是ref0,故顯示透明。球體除膠囊體範圍的區域,ref0,跟背景的ref0相等,故全部通過測試,球體渲染。
效果:
這是用乙個蒙板來控制角色的顯示,目的是讓在想顯示的區域顯示角色,在不想讓他顯示的區域不顯示,有點像裁剪。**如下:
蒙版**:
// upgrade note: replaced 'mul(unity_matrix_mvp,*)' with 'unityobjecttoclippos(*)'
shader "custom/unlitstencilmaskvf"
cginclude
float4 vertex : position;};
struct v2f
; v2f vert
half4 frag
(v2f i)
: sv_target
endcg
pass
cgprogram
#pragma vertex vert
#pragma fragment frag
endcg}}}
角色的**:
shader "custom/unlitstencilvf"}
subshader
lod 100
pass
cgprogram
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include
"unitycg.cginc"
float4 vertex : position;
float2 texcoord : texcoord0;};
struct v2f ;
sampler2d _maintex;
float4 _maintex_st;
fixed4 frag (v2f i)
: sv_target
endcg }}
}
分析:1.首先看遮罩的queue,先渲染遮罩蒙版shader,(蒙版的queue=geometry,角色的queue=geometry+1),
colormask 0意味著不輸出顏色,然後關閉zwrite,防止後面的角色因為深度原因被剔除掉,然後ref 1 comp always是把模板的引用值設定為1,為了之後在渲染角色的時候,讓ref=1的部分通過模版測試。pass replace此時模板緩衝區ref全部替換為1
2.然後渲染角色shader,在檢測渲染狀態的時候,模板測試過程中 ref 1 comp equal,意思是只有當引用值跟模板緩衝區的值都為1,測試通過,此時因為在遮罩區域的ref為1,遮罩外面全部是0,所以,只有遮罩內的角色畫素才能顯示出來
socket 案例分析
所謂網路,就是很多電腦相互連線起來所組成的。我們要學網路程式設計,其實就是程式設計來實現兩個計算機之間通訊。比如,瀏覽器就使用到網路通訊,使得我們的計算機可以和 伺服器通訊,獲取到我們需要瀏覽的內容。又如,qq 讓我們可以和好朋友一起交流。以上這些都是使用到了網路程式設計。程式分為服務端和客戶端 服...
需求分析案例
最近有這樣乙個需求。某產品負責人向我們提出 目前他每天需要關注產品線的一些銷售資料。該產品線產品分類如右圖所示。目前每天我需要關注的資料如下,希望能整合檢視。在之後又有補充 就像破案一樣,為了找出最後的真相,需要先盡可能多地 蒐集線索 這些線索就對應著現象,真相就是原因。在蒐集到線索後,需要進行初步...
死鎖案例分析
死鎖的產生以及解決辦法,看 分析,注意裡邊的注釋,自行執行。package thread 模擬買票 author yhl class thread02 implements runnable else 同步 塊 public void sale catch interruptedexception ...