實例演示相機的OnImageRender和Clear Flags清理標識(Unity3D)

恬靜的小魔龍itMonon 2021-08-15 17:05:53 阅读数:665

本文一共[544]字,预计阅读时长:1分钟~
演示 onimagerender clear flags 清理

這是我參與8月更文挑戰的第14天,活動詳情查看:8月更文挑戰

推薦閱讀

一、前言

無論多基礎、簡單的知識,只要不會,就是難。。 這次的總結主要與相機上的Clear Flags及OnImageRender函數有關 Clear Flags 對於這個選項,我是這麼理解的:每一個相機在開始繪制時,都需要對當前RenderBuffer中的顏色緩沖區(ColorBuffer)和深度緩沖區(Z-Buffer)進行是否清除的操作,這個選項控制了清除及清除後的內容。

下面將展示一下不同Clear Flags設置下的區別: 在這裏插入圖片描述 (相機繪制一個藍色的立方體)

Sky box:清除顏色緩沖區和深度緩沖區,並將顏色緩沖區設置為天空盒的顏色。 在這裏插入圖片描述

(立方體以外部分的"ColorBuffer"都被天空盒填滿)

Solid Color:清除顏色緩沖區和深度緩沖區,並將顏色緩沖區設置為一個固定的顏色。 在這裏插入圖片描述 (立方體以外部分的"ColorBuffer"都被選定的顏色填滿)

上述兩種選項是最容易理解的,只是直接清除了緩沖區內的顏色和深度數據,因此如果場景中存在多個相機,且最後一個相機被設置為上述兩種ClearFlags,那麼,呵呵,之前的相機繪制結果將無法直接顯示(因為都被清掉了)。

Depth Only:保留顏色緩沖區,僅清除深度緩沖區。 在這裏插入圖片描述 (兩部相機先後繪制) 在這裏插入圖片描述 (僅清除了深度緩沖區的繪制)

很容易發現,由於拍藍色立方體的藍色相機後繪制,且不清除顏色緩沖區,因此藍色相機在繪制之前,顏色緩沖區已經被紅色相機所拍的結果:SolidColor + 紅色立方體所填充,因此藍色立方體只是在這基礎之上進行的繪制。 並且,由於清除了深度緩沖區,藍色立方體無論空間是否被紅色立法體遮擋,總會任性的全部繪制,因此產生了錯誤的遮擋效果。

Don't Clear:毛都不清除。 在這裏插入圖片描述 (毛都不清除的繪制-保留了深度緩沖區)

同上,顏色緩沖區在保留的同時,也保留了深度緩沖區,這樣藍色相機在繪制時,就會被紅色立方體的深度值所影響,因此獲得了正確的遮擋效果。

對了,如果只有一個相機,並且這個相機還設置了“DepthOnly”或者“Don'tClear“的選項,也就是不清除顏色緩沖區,那麼當你拖動一個物體時,就會產生這種擼多了的效果: 在這裏插入圖片描述 (無影脚應該就是這麼拍的吧)

OnRenderImage 那麼OnRenderImage跟這個相機的ClearFlags有什麼關系呢? 其實沒有什麼太大關系。

這個函數通常是用來做什麼的? 重寫這個函數是為了達到屏幕後處理特效的目的,比如全屏虛化等。

這個函數如何使用及調用時機? 首先,包含這個函數的脚本必須附著在一個相機上; 其次,一旦重寫這個函數,這個函數所發生的時機,就是在這個相機完成與自己有關的全部渲染後,即將把這次渲染結果更新給當前RenderBuffer時的那一夜(刻)。

大概的觸發時機如下圖: 在這裏插入圖片描述 注意,如果你重寫了這個函數,必須有一個將緩沖區傳遞給dest的操作,即調用Graphics.Blit(rt, dest)。如果沒有這個操作,可以想象,經過這個相機後,RenderBuffer中將會是一片漆黑。

但是:一片漆黑僅僅是因為沒有把正確的顏色緩沖區設置給當前的RenderBuffer中的ColorBuffer部分,深度緩沖區仍然不受影響。

以下將討論幾種情况,希望能把問題說清楚: 測試的環境 在這裏插入圖片描述 1、兩個立方體的空間比特置關系,紅色遮擋了藍色。 2、藍色相機只拍藍色立方體,紅色相機只拍紅色立方體。 3、相機渲染的順序:紅色 → 藍色。 在這裏插入圖片描述 4、藍色相機的渲染結果同時填充給屏幕左下角的Image,紅色相機的渲染結果同時填充給屏幕左下二號Image。

第一種情况 藍色相機Depth Only, 紅色相機Solid Color = 天藍色。 在這裏插入圖片描述 在這裏插入圖片描述 第二種情况 藍色相機Solid Color = 壯漢粉, 紅色相機Solid Color = 天空藍 在這裏插入圖片描述 在這裏插入圖片描述 第三種情况 藍色相機Solid Color = 壯漢粉,紅色相機Depth Only 在這裏插入圖片描述 紅色相機第一幀 在這裏插入圖片描述 第一幀後 在這裏插入圖片描述 第四種情况 藍色相機Don't Clear,紅色相機Solid Color + 空OnImageRender函數 在這裏插入圖片描述 紅色相機沒有做向dst傳遞顏色緩沖區的動作 在這裏插入圖片描述 紅色相機沒有生成任何東西 在這裏插入圖片描述 藍色受到了紅色立方體深度值的影響

分析 在這裏插入圖片描述 總結: 只要心心念著顏色緩沖區 和 深度緩沖區,掐指一算就差不多了。

版权声明:本文为[恬靜的小魔龍itMonon]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815170542650y.html