Shader的渲染佇列

2021-10-08 23:51:53 字數 1835 閱讀 4059

首先看一下unity中的幾種內建的渲染佇列,按照渲染順序,從先到後進行排序,佇列數越小的,越先渲染,佇列數越大的,越後渲染

background(1000)最早被渲染的物體的佇列。

geometry   (2000)不透明物體的渲染佇列。大多數物體都應該使用該佇列進行渲染,也是unity shader中預設的渲染佇列。

alphatest   (2450)有透明通道,需要進行alpha test的物體的佇列,比在geomerty中更有效。

transparent(3000)半透物體的渲染佇列。一般是不寫深度的物體,alpha blend等的在該佇列渲染。

overlay      (4000)最後被渲染的物體的佇列,一般是覆蓋效果,比如鏡頭光暈,螢幕貼片之類的。

當然在unity中我們也可以自定義渲染佇列如

unity引擎一般都會先對物體進行排序,在渲染。渲染順序:

先渲染所有的不透明物體,並開啟他們的深度測試和深度寫入。(從前往後渲染)把半透明物體按他們距離相機的位置遠近來渲染,按照從後往前的順序渲染,開啟他們的深度測試,但是關閉深度寫入。這樣當半透明物體較多時,半透明物體之間沒有所謂的通過深度測試來剔除優化,每個半透明的物體都會進行渲染,會造成大量的over draw。這也是為什麼粒子特效比較耗費效能的原因。 

首先看一下ztest,ztest即深度測試,所謂測試,就是針對當前物件在螢幕上(更準確的說是frame buffer)對應的畫素點,將物件自身的深度值與當前該畫素點快取的深度值進行比較,如果通過了,本物件在該畫素點才會將顏色寫入顏色緩衝區(可在螢幕上顯示),否則否則不會寫入顏色緩衝(不可在螢幕上顯示)。

ztest的狀態有:

ztest less(深度小於當前快取則通過ztest greater(深度大於當前快取則通過)ztest lequal(深度小於等於當前快取則通過)ztest gequal(深度大於等於當前快取則通過)ztest equal(深度等於當前快取則通過)ztest notequal(深度不等於當前快取則通過)ztest always(不論如何都通過)

zwrite比較簡單,只有兩種狀態,zwrite on(開啟深度寫入)和zwrite off(關閉深度寫入),當我們開啟深度寫入的時候,物體被渲染時針對物體在螢幕(更準確地說是frame buffer)上每個畫素的深度都寫入到深度緩衝區;反之,如果是zwrite off,那麼物體的深度就不會寫入深度緩衝區。這裡寫入深度緩衝區我個人的理解就是就是重新設定深度的參考值,在深度測試是用來比較。

ztest分為通過和不通過兩種情況,zwrite分為開啟和關閉兩種情況的話,一共就是四種情況:

深度測試通過,深度寫入開啟:寫入深度緩衝區,寫入顏色緩衝區;

深度測試通過,深度寫入關閉:不寫深度緩衝區,寫入顏色緩衝區;

深度測試失敗,深度寫入開啟:不寫深度緩衝區,不寫顏色緩衝區;

深度測試失敗,深度寫入關閉:不寫深度緩衝區,不寫顏色緩衝區;

注:深度測試通過再去看是否開啟深度寫入,如果深度測試沒有通過也就不會有深度寫入了。

參考自:

Shader渲染佇列數值範圍

渲染佇列 渲染佇列描述 渲染佇列值 background 這個佇列被最先渲染。它被用於skyboxes等。1000 geometry 這是預設的渲染佇列。它被用於絕大多數物件。不透明幾何體使用該佇列。2000 alphatest 通道檢查的幾何體使用該佇列。它和geometry佇列不同,對於在所有立...

Shader 渲染佇列 ZWrite和ZTest

本文 僅供學習 1 什麼是深度?深度其實就是該畫素點在3d世界中距離攝像機的距離。離攝像機越遠,則深度值 z值 越大。2 什麼是深度快取?深度快取中儲存著準備要繪製在螢幕上的畫素點的深度值。如果啟用了深度緩衝區,在繪製每個畫素之前,opengl會把該畫素的深度值和深度快取的深度值進行比較。如果新畫素...

Shader 渲染流程

gpu graphics processing unit,影象處理器,gpu上有成千上萬核,這些核並行執行 cpu central processing unit,處理器,cpu通常有單核 雙核 四核和八核,但這些核只能序列操作。渲染流水線的工作任務在於由乙個三維場景出發 生成 或渲染 一張二維影象...