最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【技術(shù)美術(shù)百人計劃】模板測試與深度測試

2023-06-22 15:44 作者:柴郡筆記  | 我要投稿

模板測試概覽:

圖1為顏色緩沖區(qū)

圖2為模板緩沖區(qū),默認為0,給每個片元分配一個[0,255]之間的數(shù)值,8位。

圖3為通過自定義準則得到的結(jié)果。為0則不渲染,為1則渲染。


模板測試在渲染管線的位置:

Stencil Test

Pixel Ownership Test:控制像素的使用權(quán)限。(只能在game窗口和scene窗口顯示。其他位置都會被剔除掉)

Scissor Test:裁剪測試。(在game和scene窗口內(nèi),自己可以再次定義渲染范圍)

Alpha Test:透明度測試。(設(shè)置一個透明度閾值,大于這個閾值就通過測試,相反小于就剔除)

Stencil Test:模板測試

Depth Test:深度測試

Blending:透明度混合


模板測試書面理解:

模板緩沖區(qū)可以為屏幕上的每一個像素點保留一個無符號的整數(shù)值(通常是8位整數(shù))。

在渲染中,可以用這個值與一個預(yù)先設(shè)定的參考值相比較,根據(jù)比較結(jié)果來決定是否更新相應(yīng)顏色點的值,這個過程被稱為模板測試。

模板測試發(fā)生在透明度測試后,深度測試前,如果模板測試通過,則更新像素值,反之則不更新。


模板測試語法:


比較操作ComparisonFunction


更新值(stencilOperation)


模板測試總結(jié)

  • 使用模板緩沖區(qū)最重要的兩個值:當前模板緩沖值(stencilBufferValue)和模板參考值(referenceValue)。

  • 模板測試主要就是對這兩個值使用特定的比較操作:Never,Always,Less,LEqual,Greater,GEqual,Equal。

  • 模板測試之后要對模板緩沖區(qū)的值(stencilBufferValue)進行更新操作,更新操作包括:Keep,Zero,Replace,IncrSat,DecrSat,Invert等等。

  • 模板測試之后可以根據(jù)結(jié)果對模板緩沖區(qū)做不同的更新操作,比如模板測試成功操作Pass,模板測試失敗操作Fail,深度測試失敗操作ZFail,還有正對正面和背面精確更新操作PassBack,PassFront,F(xiàn)ailBack等等。




深度測試(Z Test)

深度測試判斷物體前后遮擋關(guān)系
深度測試在模板測試后透明度混合前

深度測試是什么:

所謂深度測試,針對當前對象在屏幕上(frame buffer)對應(yīng)的像素點,將對像自身的深度值與當前該像素點緩存的深度值作比較,通過則寫入顏色緩沖,否則不寫入。

發(fā)展理解上的深度測試

深度緩沖區(qū)

深度緩沖就像顏色緩沖一樣,在每個片段儲存信息,和顏色緩沖有著一樣的寬度和高度。深度緩沖是由窗口系統(tǒng)自動創(chuàng)建的,他會以16、24、32位float的形式儲存深度值。大部分系統(tǒng)中,其精度都是24位的。

Z-Buffer中儲存的是當前的深度信息,對于每個像素存儲一個深度值。

通過ZWrite和ZTest調(diào)用ZBuffer(深度緩沖區(qū))實現(xiàn)相應(yīng)的效果。


ZWrite(深度寫入)

深度寫入包括兩種狀態(tài):ZWrite On 和 ZWrite Off。

當我們開啟深度寫入時,物體被渲染到屏幕上時,每個像素的深度都寫入到深度緩沖區(qū)中;反之,則不會寫入到深度緩沖中。但是,物體是否被寫入深度緩沖,除了ZWrite外,更重要的是ZTest(深度測試)通過,如果ZTest都沒通過,那也就不會寫入深度了。


ZTest(深度測試)

ZTest分為通過和不通過兩種狀態(tài),加上ZWrite就是4種狀態(tài)。

  • 深度測試 On,深度寫入 On:寫入深度緩沖區(qū),寫入顏色緩沖區(qū)。

  • 深度測試 On,深度寫入 Off:不寫入深度緩沖區(qū),寫入顏色緩沖區(qū)。

  • 深度測試 Off,深度寫入 On:不寫入深度緩沖區(qū),不寫入顏色緩沖區(qū)。

  • 深度測試 Off,深度寫入 Off:不寫入深度緩沖區(qū),不寫入顏色緩沖區(qū)。

ZTest比較操作


渲染隊列

unity有幾種內(nèi)置的渲染隊列,從先到后,數(shù)字越小越先渲染。

使用方法:

不透明物體渲染順序:從前到后

透明物體渲染順序:從后到前


Early-Z

傳統(tǒng)渲染管線中,ZTest處于Blending階段,這時會進行深度測試,所有對象的像素著色器都會計算一遍,會造成大量無用計算,每個像素點會重疊很多計算。

因此,現(xiàn)代GPU運用了Early-Z的技術(shù),在頂點著色器和片元著色器之間進行一次深度測試,如果失敗,則不必進行片元計算,提升性能。但是最終ZTest仍要進行,以保證計算遮擋結(jié)果的正確。

前面的一次Z-Cull是為了裁剪以達到優(yōu)化目的,后一次主要是Z-Check,為了檢查,如下圖:


深度值

  • 世界坐標的Z分量

  • 觀察空間的Z分量(線性深度)

  • 準備投影,深度緩沖中存儲Z/W分量(透視投影非線性)

https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/01%20Depth%20testing/

深度值

為什么深度緩沖區(qū)存儲非線性深度呢?

正確的投影特性的非線性深度方程是和1/z成正比的,這樣基本上做的是在Z很近的時候是高精度和Z很遠的時候是底精度。這樣就是模擬了人眼觀察,近處的物體很清晰,而遠處的物體很模糊。


Fdepth%3D%5Cfrac%7B1%2Fz%E2%88%921%2Fnear%7D%7B1%2Ffar%E2%88%921%2Fnear%7D


深度沖突

兩個平面或三角形很緊密相互平行,深度緩沖區(qū)不具有足夠的精度以至于無法得到哪一個靠前。導致了著兩個形狀不斷切換順序出現(xiàn)怪異問題。這被稱為深度沖突(Z-fighting),因為它看上去像形狀爭奪頂靠前的位置。


解決方法

  • 讓物體之間不要離得太近。

  • 盡可能把近平面設(shè)置得遠一些。

  • 放棄一部分性能來獲得更高精度的深度值。


深度測試總結(jié)

  • 使用深度緩沖區(qū)最重要的兩個值:當前深度緩沖區(qū)值(ZBufferValue)和深度參考值(referenceValue),并通過比較操作獲取理想渲染效果。

  • Unity中的渲染順序:先渲染不透明物體,順序是從前到后;在渲染透明物體,順序是從后到前。

  • 通過ZWrite和ZTest組合使用控制半透明物體的渲染。

  • 引入Early-Z技術(shù)后的深度測試相關(guān)的渲染流程。

  • 深度緩沖區(qū)中儲存的深度值為0-1范圍的浮點數(shù),且為非線性,大多數(shù)精度都是24位。


【技術(shù)美術(shù)百人計劃】模板測試與深度測試的評論 (共 條)

分享到微博請遵守國家法律
丽江市| 乌拉特前旗| 湖南省| 晋宁县| 英吉沙县| 万盛区| 信丰县| 台中县| 兴安县| 云霄县| 萨迦县| 棋牌| 常山县| 西林县| 房山区| 依兰县| 三明市| 黔西县| 左贡县| 泰顺县| 如皋市| 含山县| 天门市| 双牌县| 宁乡县| 聊城市| 宁都县| 四平市| 河津市| 忻州市| 安康市| 伽师县| 防城港市| 定安县| 河间市| 永年县| 宜良县| 大化| 静海县| 德化县| 云林县|