龍圖教育各種遊戲特效實現教程?

Tags: 教程, 特效, 龍圖,

工具/原料

3Dmax 、 ps 、 AE、Unity 3d

一般普通的拾取就是AABB,再是OBB,或者是遍歷一個模型的面。這三種方式都有缺陷。

現在說一種方法:就是為每個渲染物或者說是Entity附一個唯一的顏色值,然後創建一個與屏幕大小一樣的RTT,把這些模型渲染到這個個RTT上,在這個渲染過程中,不需要傳入模型的紋理,只需要把顏色作為輸出顏色。最後通過鼠標在屏幕的XY位置就可以索引出這張紋理的顏色,根據這個顏色就知道了哪個模型被拾取。

當一個模型被拾取時,在shader中要根據每個頂點的發線把頂點擴大一定距離,然後把勾邊的顏色作為輸出顏色渲染。然後還要把這次pass的cull反過來。

有些特效會在場景中有擾動的效果,這種實現方法是把這個特效的範圍作為一個RTT,在渲染這個RTT的過程中把像素扭曲,然後再輸出。

LightPrePass的實現與延遲渲染的實現類似延遲渲染。

首先把場景渲染到GBuffer,GBuffer由2或3張紋理組成,分別代表深度(R32F),法線(RGBA),或者材質信息。

(我的做法是:深度只用R代表,因為只能存放0,1之間的值,所以我的深度值用View空間的值再除FarPlane,到時在LightBuffer中要轉回LightBuffer的計算空間)

計算點光源和太陽光的效果,生成一張紋理lightbuffer。

場景渲染時要取lightbuffer紋理給模型著色。

deferred shading和lightprepass最終的效果是差不多的,但實現起來有區別:

deferred shading整個場景至少只需要渲染一次;lightprepass要至少渲染兩次。

deferred shading場景渲染一次時生成至少三張圖:color,depth,normal。

最終再用這三張圖來合成最後的畫面。

lightprepass是第一次渲染場景只生成depth和normal。

第二次渲染場景的時候把depth和normal作為每個物件的必要紋理傳進去,然後進行光照著色。

這裡提出一個疑問:為什麼不需要position圖?因為只要有depth,在最後一步可通過viewproj矩陣的逆矩陣求出對應的世界座標位置。

你平時可以在網上多看看一些相關的教程,如果看教程還是覺得比較難的話,你可以去報相關的培訓班,龍圖教育就不錯。

不恥下問

相關問題答案