unity基礎學習之camera

2021-10-08 19:45:38 字數 4217 閱讀 6416

認識一下基礎配置:

在攝像機進行渲染前,對顏色緩衝及深度緩衝,進行不同控制操作,每個相機在渲染時會儲存顏色和深度資訊。螢幕的未繪製部分是空的,預設情況下會顯示天空盒。當你使用多個相機時,每乙個都將自己的顏色和深度資訊儲存在緩衝區中,還將積累大量的每個相機的渲染資料。當場景中的任何特定相機進行渲染時,你可以設定清除標記以清除緩衝區資訊的不同集合。可以通過下面四個選項之一來完成:

skybox:清除顏色緩衝和深度緩衝,沒有物體遮擋的背景,用天空盒子填充。

solid color:清除顏色緩衝和深度緩衝,沒有物體遮擋的背景,用 camera 的另乙個屬性background的顏色填充。

depth only:只清除深度快取。

don』t clear:顏色緩衝和深度緩衝都不清除。

這個相機可以繪製的layer圖層,這個每乙個節點都會有這個屬性,如下圖所示

投影的方式:可以為透視投影或者正交投影

相機張開的角度,相當於眼睛張開的角度

near:0.3,近裁切面深度值

far:1000,遠裁切面深度值

這兩個值將會決定視錐體的長度

x:0.0

y:0.0;

w:1.0;

h:1.0;

這四個引數會決定相機投影到螢幕座標系的具體位置和大小,按照現在這個設定,則完全覆蓋螢幕,因為螢幕的大小就是(1.0,1.0),螢幕的座標系原點就是(0.0,0.0);

這個值越大,說明這個相機所包含的內容越先被渲染

渲染紋理

unity中使用rendertexture來接收fbo(視覺化fbo),game視窗是乙個特殊的rendertexture,它允許多個fbo疊加渲染,當camera的rendertarget都設定為null時表示輸出到game視窗(沒有攝像機的rendertaget為null會顯示沒有攝像機進行渲染),設定不為null表示輸出到某個rt

cpu------>上傳紋理----->gpu renderbuffer–>當要渲染某個紋理時,會生成framebuffer–>

如果此時將framebuffer繫結到framebufferobject(fbo),則這個紋理就會被寫入到渲染紋理中,攝像機如果渲染紋理設定為null,那麼攝像機的渲染紋理預設指的是螢幕,如果是自己建立的渲染紋理,則會將結果輸出到其中,類似於截圖或者小地圖的效果,

//截圖**

rendertexture rendertexture = m_camera.targettexture;

//拿到目標渲染紋理

rendertexture.active = rendertexture;

texture2d tex =

newtexture2d

(rendertexture.width, rendertexture.height)

;//新建紋理儲存渲染紋理

tex.

readpixels

(new

rect(0

,0, rendertexture.width, rendertexture.height),0

,0);

//把渲染紋理的畫素 給texture2d,才能在專案裡面使用

tex.()

;//記得應用一下,不然很蛋疼

byte

bytes = tex.

encodetopng()

;//拿到的byte

file.

writeallbytes

"/resources/screenshort/"

+ _index.

tostring()

+".png"

, bytes)

;//寫入本地

渲染路徑決定了光照在 shader 中是如何應用的,所以在計算光源時,需要在每個 pass 塊內指定它的渲染路徑,unity 才會為我們提供正確的光照資訊

渲染路徑:一般有以下四種

legacy vertex lit:遺留的頂點照明渲染.光照效果最一般的,不支援陰影,一般用於配置較差的移動裝置

forward:前向渲染,能夠很好的支援光照效果,不支援點光源和聚光燈的陰影,一般採用烘焙的方式來處理更多的陰影,前向渲染路徑是我們最常用的一種渲染路徑。在進行一次完整的前向渲染時,我們需要渲染該物件的渲染圖元,並計算兩個緩衝區的資訊:顏色緩衝區和深度緩衝區。

利用深度緩衝來決定乙個片元是否可見,如果可見就更新顏色緩衝區中的顏色值

pass 

else

}}

對於每個逐畫素光源,都需要進行上面一次完整的渲染流程。如果乙個物體在多個逐畫素光源的影響區域內,那麼該物體就需要執行多個pass,每個pass計算乙個逐畫素光源的光照結果,然後在幀緩衝中把這些光照結果混合起來得到最終的顏色值。假設,場景中有n個物體,每個物體受到m個光源的影響,那麼就需要 n * m 個 pass。可以看出,如果有大量逐畫素光照,需要執行的pass數目也會很大。所以 unity 會限制每個物體的逐畫素光照的數目

deferred lighting:延遲渲染,支援最佳的光照效果以及所有型別的光照投影,但是需要硬體支援, pro模式才有.

延遲渲染主要包含兩個pass。第乙個pass中,不進行任何光照計算,僅僅計算哪些片元是可見的,這主要是通過深度緩衝技術來實現,當發現乙個片元是可見的,就把它的相關資訊儲存到g緩衝區中。然後在第二個pass中,利用g緩衝區的各個片元資訊,如表面法線、視角方向、漫反射係數等,進行真正的光照計算。

延遲渲染過程用偽**描述如下:

pass

1else}}

}pass2}

}

可以看出,延遲渲染使用的pass數目通常就是兩個,這跟場景中包含的光源數目是沒有關係的。換句話說,延遲渲染的效率不依 賴於場景的複雜度,而是和我們使用的螢幕空間的大小有關。這是因為,我們需要的資訊都儲存在緩衝區中,而這些緩衝區可以理解 成是一張張2d影象,我們的計算實際上就是在這些影象空間中進行的。

unity中的延遲渲染

unity有兩種延遲渲染路徑,一種是遺留的延遲渲染路徑,即unity 5之前使用的延遲渲染路徑,而另一種是unity5.x中使用的延遲渲 染路徑。如果遊戲中使用了大量的實時光照,那麼我們可能希望選擇延遲渲染路徑,但這種路徑需要一定的硬體支援。

對於延遲渲染路徑來說,它最適合在場景中光源數目很多、如果使用前向渲染會造成效能瓶頸的情況下使用。而且,延遲渲染路 徑中的每個光源都可以按逐畫素的方式處理。但是,延遲渲染也有一些缺點。

不支援真正的抗鋸齒(anti-aliasing)功能。

不能處理半透明物體

對顯示卡有一定要求。如果要使用延遲渲染的話,顯示卡必須支援mrt(multiple render targets)、shader mode 3.0及以上、深度渲 染紋理以及雙面的模板緩衝。

當使用延遲渲染時,unity要求我們提供兩個pass。

(1)第乙個pass用於渲染g緩衝。在這個pass中,我們會把物體的漫反射顏色、高光反射顏色、平滑度、法線、自發光和深度等 資訊渲染到螢幕空間的g緩衝區中。對於每個物體來說,這個pass僅會執行一次。

(2)第二個pass用於計算真正的光照模型。這個pass會使用上乙個pass中渲染的資料來計算最終的光照顏色,再儲存到幀緩衝中。

預設的g緩衝區(注意,不同unity版本的渲染紋理儲存內容會有所不同)包含了以下幾個渲染紋理(render texture,rt)。

rt0:格式是argb32,rgb通道用於儲存漫反射顏色,a通道沒有被使用。

rt1:格式是argb32,rgb通道用於儲存高光反射顏色,a通道用於儲存高光反射的指數部分。

rt2:格式是argb2101010,rgb通道用於儲存法線,a通道沒有被使用。

rt3:格式是argb32(非hdr)或argbhalf(hdr),用於儲存自發光+lightmap+反射探針(reflection probes)。

深度緩衝和模板緩衝。

當在第二個pass中計算光照時,預設情況下僅可以使用unity內建的standard光照模型。如果我們想要使用其他的光照模型,就需要 替換掉原有的internal-deferredshading.shader檔案。

legacy deferred:(遺留的延遲渲染)

unity學習之資料庫基礎

unity學習 筆記,希望對朋友們有所幫助 資料的用處 1 儲存大量資料,方便檢索和訪問 2 保持資料資訊的一致 完整 3 共享和安全 4 通過組合分析,產生新的有用資訊 資料庫的發展史 萌芽階段 檔案系統 使用磁碟檔案來儲存資料 初級階段 第一代資料庫 出現了網狀模型 層次模型的資料庫 中級階段 ...

unity基礎學習05

滑鼠鍵盤輸入 1.獲取鍵盤輸入 1.相關 input.getkey 按下某鍵後,持續返回 true input.getkeydown 按下某鍵的一瞬間,返回 true input.getkeyup 抬起某鍵的一瞬間,返回 true 返回值 bool 型別 引數 keycode 列舉 enum key...

Unity基礎框架學習 音效(2)

unity基礎框架學習 音效 1 unity基礎框架學習 音效 2 unity基礎框架學習 音效 3 unity基礎框架學習 音效 4 unity基礎框架學習 音效 5 效果展示加擴充套件 接下來開始 首先我們希望在 某乙個物體下面掛載我們需要管理的 audiosource 元件,初始時可以將它設為...