stencil案例分析

2021-09-25 18:16:11 字數 3304 閱讀 4675

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 ...