維尼的蜂巢

RealTime??!! It’s amazing!!!!

Depth of Field 景深 五月 16, 2006

Filed under: 3D Graph,Xbox360 — kevinlin @ 1:13 上午

景深(Depth of Field)
就是前景清晰但是背景模糊的效果
http://i.i.com.com/cnet.g2/images/2006/128/926632_20060509_screen002.jpg
用來做焦點的突顯 在電影裡常常用到 如果要拍出這樣的東西需要一點技術
有人問怎麼做 我只是大概說了 跟HDR概念差不多..
竟然有人在巴哈說了這樣的話
        其實跟HDR沒什麼關係
        這個效果在LDR運算環境下就可以做出來了
        比較簡單的方法有兩種
        一個是對投影矩陣以焦點為中心
        把比焦點遠和比焦點近的座標空間分別添加不同的位移量
       
http://www.glprogramming.com/red/images/Image125.gif
        然後把不同位移量的投影矩陣所產生的多張圖片合併
        不過這個方法速度比較慢
        另一個方法是直接取目前的ColorBuffer畫面和對應的Z-Buffer資料
        以Z-Buffer中各Pixel的Z值和焦點的Z值的差值,做為Blur強度的參數
        然後以此資訊對ColorBuffer進行各部位Blur程度不同的Blur處理
        跟焦點的深度誤差大的Pixel就會比較模糊
        跟焦點的深度誤差小的Pixel就會比較清楚
        這方法速度比較快
        現今遊戲所使用的通常都是這種方式
        事實上 要做到接近真實的感覺必須要用HDR

HDR才夠表現出自然光 RGBA可以到16bits 或32bits
http://www.daionet.gr.jp/~masa/rthdribl/Image/dof6_00.jpg
真想問他是看到哪個遊戲用那種方法
目前用硬體加速的方法都是用 後處理(post-processing)
就是先把結果render到一張材質上 再針對這張材質做處理
最後在把這張材質輸出到螢幕上
大部分知名的賽車遊戲都是用後處理來處理車身對環境的反射
然後景深就是用後處理經過兩個pass
pass1:將場景附帶一些資訊render出來
           這我見到的方法就有兩種1.是render出一張A8R8G8B8跟一張G16R16(放Depth16跟Blurriness16)的圖 2.render出一張A16B16G16R16

pass2:將剛剛的圖做一些filter(一般來說是先縮小在blur它,但也有許多其他方法),常聽到的高斯模糊也可以用來做filter

最後在合成就能產生景深 這樣的效果既好 又是給GPU算的 比巴哈回我那個蠢方法好多了

而在非HDR下我知道 可以用Jittering的方法來算 用查表的方式先建好表格 執行時查表省去運算的步驟
http://www.glprogramming.com/red/chapter10.html

但是他後面提的一個pixel一個pixel針對z-buffer的計算 我就不信他給CPU算 800*600 可以跑遊戲,可以跑即時的遊戲 我認為他只能做影像處理

看他IP是中央的,看來又是個嘴砲,不過我也不確定加上我與世無爭 所以不想回他:PŠ

 

4 Responses to “Depth of Field 景深”

  1. 阿鋒 Says:

    吐他…你跟他說你是國中生…說這個是基本常識

  2. kaiwei.lin Says:

    我太有修養了 不回那個白痴😛

  3. 路人 Says:

    偶然路過此地
    國中生就在學3D…真是後生可畏:)

    不過我在想那個中央那位人士的說法並沒有錯
    DOF本來就是和HDR無關…
    DOF的演算主要需要Depth 資料(當然也需要Color), HDR的演算卻是需要高精確度的Color資料
    只是類似的是他們都需要較高精確度的資料內容..比如說16bit/32bit 整數或是浮點數
    再者那位人士的說法其實是就原理來說是這樣做.
    當然你要用硬體時作時就要考量到硬體功能了…
    比如說DOF就是要有個Depth資訊…哪裡來呢.直覺就是Z Buffer…
    nvidia的顯示卡是可以把Z buffer直接當作一般texture放到shader裡.
    可是標準的DirectX 沒有定義把Z Buffer當作texture丟到shader的行為…
    .像ATI的卡就不能這麼做了
    OK…那就render到color buffer…
    嗯..這時出現問題…有沒有MRT, 有沒有16bit或是32bit的精確度的color buffer可以產生…
    不同硬體就產生不同的實作方式
    在DX8時期沒有MRT和16bit texture的時候, 還是有人做出DOF和HDR效果.

    實作上雖然都算是post processing…
    但是就演算法來說…兩個可是不相同
    因為細節可差很多…DOF可以one pass就完成了…HDR多好幾個pass..

    加油加油…

  4. kaiwei.lin Says:

    恩恩 我後來也有發現DOF不需要HDR
    是算法跟pass類似 我沒有很深入的探討 以後會好好的研究一下

    還有…跟你說一個小秘密..我不是國中生…


發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s