好久沒有更新過博克了,春節的最後一天更新一下,寫一下關於遊戲中關於光影效果的方法,以及我的實現.
關於遊戲中的光照,就目前來看大致兩種方式,一種是unreal的與渲染光照貼圖+shadowmap,另一種則是crysis的完全實時光影。效果上都不錯,下面來簡單分析一下。
在討論之前先要明確一點,遊戲中的光影真的要追求和現實中一樣的物理機理麼?答案是否定的。畫面是乙個視覺藝術,只要看上去真是,亮麗就可以了,至於現實中是不是真的是這樣再次,只要大的光影與現實中一致就行,細節和實現方法可以不遵循真實的物理原理。
先說一下unreal3的光影方案。總的來說就是直接光照生成光照貼圖再加上執行時運動物體的shadowmap,通過對其編輯器的使用並沒有發現很明顯的全域性光照的影子。反而是使用了大量的光源來模擬全域性光照。對於模型可以選擇是使用頂點色還是光照貼圖。從實際效果上看,其實使用直接光照,通過手動放置更多的光源是可以達到很不錯的光影效果。這樣做的問題並不在效果上,而是不能做到實時的所見即所得,必須要通過編譯光照得到結果,光照貼圖只能針對靜態物體,同時從引擎設計上來看在編輯器模式和遊戲模式中可能會涉及到不同的光照方案,畢竟只有編譯後的結果才是遊戲中真正的執行的結果。
crysis的光照方案強調的是所見即所玩,而且是實時的。在crysis1的光照方案就是直接光照+shadowmap+ssao。很明顯沒什麼需要編譯的,因此可以做到所見即所玩而且是實時的。在crysis2的光照方案中考慮了全域性光照的因素。簡單來說就是建立在這樣乙個假設上:全域性光照可以通過放置若干點光源直接光照來模擬出來(其實很多遊戲編輯器中擺放大量點光源也是這個目的)。因此crysis2的全域性光照是通過演算法來自動將光源進行場景點光源的分布,進而模擬全域性光照。
從unreal,crysis的光照方案看,總的來說就是直接光照,通過(手動或者自動)放置更多光源來進行全域性光照的模擬(生成光照圖或者實時計算),同時運動物體使用shadowmap。
我們先拋開物理上光能傳遞等機理。直接光照中,物體只接受來自光源的光照,被遮擋的地方完全不受光,而現實世界中物體物體之間好要進行間接光照,這就形成了全域性光照。而這間接光照如果不想費事去實現什麼複雜演算法,完全可以在編輯器中在需要有間接光照的地方手動擺放光源進行補光達到模擬間接光照的效果,其本質上仍然是直接光照。crysis只是使用演算法自動放置這些進行補光的光源而已。
另外從間接光照的原理上來看,間接光照的結果是使場景除了被遮擋的很厲害的地方以外大部分區域光照漸趨均勻的乙個過程。但是這是我們想要的全部麼?從畫面的精美程度上來看需要有對比度,需要畫面色彩上有層次感,而這些也許並不是現實世界中會有的效果。
接下來我說一下我的光照方案,最後上幾張圖。
首先我將光照計算分為直接光照和間接光照,並分別對應兩個函式負責計算。同時外部由指令碼命令進行直接光照和間接光照呼叫驅動。
之所以這麼做的原因是,要想達到好的效果並不是單純的直接光照或者間接光照就能做到的。簡單來說就是先進行一次直接光照,在進行間接光照,然後再進行一次直接光照。之所以這麼做如上面所講間接光照的結果會使場景亮度趨於均勻,這樣層次感就不明顯了,那麼最直接的辦法就是在進行一次直接光照,但是要注意這次直接光照的強度,可能會導致有些亮的地方過飽和。這需要進行光源亮度設定等。
之所以使用指令碼驅動直接光照和間接光照是因為並不一定是「直接光照-〉間接光照-〉直接光照」這個單一的模式。指令碼也很簡單
d i d, d i i d, d i d i i等。
其中d代表直接光照,i代表間接光照。
遊戲中的光影技術
轉至乙個遊戲開發技術文章 這是針對遊戲中的光影技術的乙個講座,是在中國的遊戲開發大會上的乙個講座。演講人來自nvidia,比較整體的介紹了下當時遊戲中的光影技術。以下是演講內容的一些整理 講座一開始主要介紹了一些光照方面的計算和光照方面的一些理論。重點介紹了光照和材質部分的內容,部分內容偏向於程式或...
遊戲中掉落效果的實現
1.計算運動引數 運動特徵 豎直方向受到重力作用,水平方向有空氣阻力作用 第一種情況 起拋點位置和掉落點位置處於同一水平面中。已知開始拋起的點位置和掉落目標位置,由此可以求出兩點之間的距離 distance 運動軌跡如下所示 根據rand 函式產生出 0,1 之間的數值,作為運動總的時間。並且hei...
遊戲中的遮擋透明效果實現
很多時候我們玩一些鎖視角遊戲都能遇到一些障礙物遮擋視野的問題。但是很多時候他們被我們自然而然地忽略掉了。但是沒有這個功能,鎖視角遊戲將會體驗很差。所以很多時候我們需要將擋視角的物體透明化。不過本文並不是基於shader的正常實現方式,所以僅僅是參考。public gameobject player ...