在渲染的時候,渲染的順序是非常重要的,對於不透明物體我們不用不考慮是因為有的深度緩衝存在。在渲染時需要把片元中的值進行比較(如果開了深度測試),但一但關了嘗試測試就沒那麼簡單了。
透明度測試:只要小於閾值就會被捨棄,完全不透明或完全透明。
透明度混合:這種方法才能得到真正的透明效果,但是需要關掉深度測試,這時候就有很多問題要我們注意了.
為什麼要關閉深度寫入呢?如果不關,乙個半透明物體後內容是應該被看到的,但如果它離攝像機更近,則後面的物體會被剔除。所以一但關掉了深度寫入渲染順序就變得非常重要了。
思考:a是透明物體,b不透明。(a離攝像機近 b離攝像機遠)
情況一:不透明物體b開了深度測試和寫入,b會先把顏色緩衝和深度緩衝寫入。a還是會深度測試,發現a比b離相機更近,因此會用a的透明度來和顏色和b混合得到正確的半透明效果。
情況二:先渲染a,深度緩衝區沒有資料,a就直接寫入了,由於半透明物體關了深度寫入,因此不會修改深度緩衝。當b來渲染的時候發現沒有寫入過(因為a來過,沒告訴別人他來過),就直接寫入了(也就覆蓋了)。
思考:ab都是半透明的(a離攝像機近 b離攝像機遠)
情況一:我們渲染b,再渲染a,那b會正深寫入顏色緩衝,然後a會和緩衝中的b進行混合得正確結果。
情況二:先渲染a,則a會先寫入緩衝區,b來的時候再和它相乘,得到相反的透明結果。
常用的方法是:
先渲染所有不透明的並開啟他們的深度測試和深度寫入。
把半透明物體按攝像機距離排序,然後從後往前渲染,開啟深度測試,關閉深度寫入。
思考但是怎麼分前後呢?中心點?邊緣點?這些都會有可能得出不正確的效果。所以解決方式只有盡可能讓模型是凸面體或考慮做成多個子物體。
可以用標籤(queue)來解決這個問題,索引號越小越早被渲染
subshader
pass
bakground 索引號:1000 最先渲染,常用背景等。
geometry 索引號:2000預設值,大多數用這個或不透明的用這個。
alphatest 索引號:2450 透明度測試用這個,不透明物體用這個會更快。
transparent 索引號:3000 透明混合
overlay 索引號:4000 最後的疊加效果
關閉深度測試
subshader
shader "custom/testshader13"
_cutoff("alpha cotoff",range(0,1))=0.5
} subshader
pass
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
fixed4 _color;
sampler2d _maintex;
float4 _maintex_st;
float _cutoff;
struct a2v;
//vertex to fragment
struct v2f;
v2f vert(a2v v)
float4 frag(v2f i):sv_target
endcg
} }}
Shader學習的基礎知識(十四)玻璃效果
這次我們使用第二種渲染紋理方式grabpass來製做乙個玻璃效果。非常簡單,用一張法線紋理來修改法線資訊,通過乙個cubemap來模擬玻璃反射,而在模擬折射時,則使用了grabpass獲取玻璃後面的螢幕影象,並在切線空間中進行偏移後,再對螢幕影象進行取樣來模擬。建立乙個立方體和乙個圓,圓放在立方體裡...
unity基礎開發 shader基礎知識
1.unity中配備了強大的陰影和材料的語言工具稱為shaderlab,以程式語言來看,它類似於cgfx和direct3d的效果框架語法,它描述了材質所必須要的一切諮詢,而不僅僅侷限於平面頂點 畫素著色。2.在unity3d中建立乙個shader assets create shader 3.建立了...
Shader學習的基礎知識(十九)廣告牌
廣告牌技術可以使用紋理看起來一起面對著自己。廣告牌技術的本質就是構建旋轉矩陣,而乙個轉換矩陣則需要三個基向量,即表面法線 normal 右指方向切線 tangent 上指方向副切線 deputy tangent 還需要乙個錨點。這裡我用它做了乙個打火機火焰的效果,素材只需要一張即可 在對應的物體下建...