Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

[TGDF 2014] 進階Shader技術

The slides I presented at TGDF 2014.

  • Sé el primero en comentar

[TGDF 2014] 進階Shader技術

  1. 1. 進階SShhaaddeerr技術 22001144台北遊戲開發者論壇 bbyy OOwweenn WWuu @@ QQuubbiitt GGaammeess
  2. 2. 18年以上遊戲開發經驗 曾開發過三套遊戲引擎 曾在加拿大ATI/AMD擔任七年的資深繪圖工程師 支援AAA遊戲圖型引擎開發,曾支援過的遊戲 UE3,Max Payne 3,Splinter Cell series ,Lost Planet series,Devil May Cry 4, etc… 曾在國際的遊戲研發會議如 GDC SF , GDC China , Korean G-Star 發表圖形技術演說
  3. 3. SShhaaddeerr PPiippeelliinnee
  4. 4. SShhaaddeerr PPiippeelliinnee
  5. 5. AAddvvaanncceedd SShhaaddeerr NNeeww SShhaaddeerrss GGeeoommeettrryy SShhaaddeerr TTeesssseellllaattiioonn SShhaaddeerr CCoommppuuttee SShhaaddeerr
  6. 6. GGeeoommeettrryy SShhaaddeerr
  7. 7. GGeeoommeettrryy SShhaaddeerr 處理一個完整的 pprriimmiittiivvee ((ppooiinntt,, lliinnee,, ttrriiaannggllee)) 可以取得周邊的pprriimmiittiivvee資訊 ((ooppttiioonnaall)) 可以輸出多個pprriimmiittiivveess 最大可輸出11002244 ffllooaattss 可以不輸出任何資料 ((ttoo kkiillll pprriimmiittiivvee))
  8. 8. GGeeoommeettrryy SShhaaddeerr AApppplliiccaattiioonn PPaarrttiiccllee 生成 BBookkeehh DDOOFF 毛髮生成 草地生成
  9. 9. GGeeoommeettrryy SShhaaddeerr BBookkeehh DDOOFF
  10. 10. GGeeoommeettrryy SShhaaddeerr BBookkeehh DDOOFF 利用DDeepptthh BBuuffffeerr產生每個PPiixxeell的CCooCC值 為每一個PPiixxeell產生一個端點 計算每個PPiixxeell的亮度值,,並依此決定是否需要 產生BBookkeehh SSpprriittee 利用GGSS來將端點根據CCooCC值產生出SSpprriittee 利用BBookkeehh TTeexxttuurree來改變BBookkeehh形狀 將BBookkeehh與BBlluurrrreedd RRTT混色
  11. 11. TTeesssseellllaattiioonn
  12. 12. TTeesssseellllaattiioonn 22 個可程序化的階段 HHuullll SShhaaddeerr DDoommaaiinn sshhaaddeerr 11 個固定管線階段 TTeesssseellllaattoorr
  13. 13. HHuullll SShhaaddeerr 分成兩部分運作 “CCoonnttrrooll ppooiinntt pphhaassee”” 在此階段將一種表面形式轉換成另一種 例如:: 將ssuubb--ddiivviissiioonn表面轉換為 BBeezziieerr ppaattcchheess 每個ccoonnttrrooll ppooiinntt執行一次 “PPaattcchh ccoonnssttaanntt pphhaassee”” 在此階段設定所需要的鑲嵌級數以及其他 的 ppeerr--ppaattcchh ccoonnssttaannttss 每個輸入的pprriimmiittiivvee執行一次
  14. 14. TTeesssseellllaattoorr 固定管線階段 在輸入的pprriimmiittiivveess內產生出新的 端點 產生多少端點取決於在HHuullll SShhaaddeerr 所計算出的tteesssseellllaattiioonn ffaaccttoorrss值 LLeevveell 11..00 LLeevveell 11..55 LLeevveell 33..00
  15. 15. DDoommaaiinn SShhaaddeerr 用來計算出在表面上的每個端 點 讀入在HHuullll SShhaaddeerr所產生的ccoonnttrrooll ppooiinntt資料 可以在此實做出各種不同的表面形式,, 例如BBeezziieerr曲面 DDiissppllaacceemmeenntt MMaappppiinngg 從ddiissppllaacceemmeenntt mmaapp紋理中採樣位移 值 然後將端點沿著法線向量位移
  16. 16. TTeesssseellllaattiioonn TTeecchhnniiqquueess DDiissppllaacceemmeenntt mmaappppiinngg wwiitthh ffllaatt tteesssseellllaattiioonn 需要有hheeiigghhtt mmaapp來做ddiissppllaacceemmeenntt 可以用來產生高品質的bbuummppyy表面或地形 PPNN--TTrriiaannggllee tteesssseellllaattiioonn 不需要額外的hheeiigghhtt mmaapp 可以產生平滑的表面 需要使用到HHuullll sshhaaddeerr PPhhoonngg tteesssseellllaattiioonn 不需要額外的hheeiigghhtt mmaapp 可以產生平滑的表面 不需要使用到HHuullll sshhaaddeerr,,效能較高
  17. 17. DDiissppllaacceemmnneett MMaappppiinngg TTrriiaannggllee PPaattcchh MMeesshh TTeesssseellllaatteedd MMeesshh
  18. 18. DDiissppllaacceemmnneett MMaappppiinngg TTeesssseellllaatteedd MMeesshh DDiissppllaacceedd MMeesshh DDiissppllaacceemmeenntt MMaapp
  19. 19. DDiissppllaacceemmnneett MMaappppiinngg DDiissppllaacceedd MMeesshh FFiinnaall IImmaaggee DDiiffffuussee TTeexxttuurree NNoorrmmaall MMaapp
  20. 20. PPNN--TTrriiaanngglleess PPNN--ttrriiaanngglleess iiss aa ppuurreellyy llooccaall sscchheemmee CCoonnssttrruucctt aa ccuubbiicc BBeezziieerr ppaattcchh aaccccoorrddiinngg ttoo tthhee tthhrreeee vveerrtteexx ppoossiittiioonnss aanndd nnoorrmmaallss ooff aa ttrriiaannggllee iinn tthhee HHuullll sshhaaddeerr CCoonnttrrooll ppooiinnttss ooff ttrriiaanngguullaarr BBeezziieerr ppaattcchh NNoorrmmaall ccoommppoonneenntt ooff PPNN--TTrriiaannggllee
  21. 21. PPhhoonngg TTeesssseellllaattiioonn PPhhoonngg tteesssseellllaattiioonn iiss aallssoo aa ppuurreellyy llooccaall sscchheemmee 不需要使用hhuullll sshhaaddeerr 去建構複雜的ppaattcchh 非常簡單的 HHuullll sshhaaddeerr,, 只是傳遞端點位置跟法向量 SSiimmppllee sshhaaddeerr ==== bbeetttteerr ppeerrffoorrmmaannccee PPhhoonngg 比 PPNN--TTrriiaanngglleess更容易實作且效率較高 同時可以產生極為相近的外觀 執行效能高出許多!! P P*
  22. 22. NNoo TTeesssseellllaattiioonn
  23. 23. PPNN--TTrriiaanngglleess
  24. 24. PPhhoonngg TTeesssseellllaattiioonn
  25. 25. TTeesssseellllaattiioonn PPNN--TTrriiaannggllee TTeesssseellllaattiioonn PPhhoonngg TTeesssseellllaattiioonn
  26. 26. NNoo TTeesssseellllaattiioonn
  27. 27. PPNN--TTrriiaanngglleess
  28. 28. PPhhoonngg TTeesssseellllaattiioonn
  29. 29. TTeesssseellllaattiioonn最佳化
  30. 30. TTeesssseellllaattiioonn最佳化
  31. 31. CCoommppuuttee SShhaaddeerr
  32. 32. CCoommppuutteerr SShhaaddeerr 可以直接略整個渲染管線來進行GGPPGGPPUU運算 PPoosstt--pprroocceessssiinngg,, OOIITT,, AAII,, PPhhyyssiiccss,, aanndd mmoorree 如此可以避免過多的ccoonntteexxtt切換動作 遊戲主程序可以控制執行緒的同步以及發派 可自由設定執行緒數目 CCoommppuuttee SShhaaddeerr線程共享記憶體 TThhrreeaadd GGrroouupp SShhaarreedd MMeemmoorryy ((TTGGSSMM)) 可以避免重複的計算以及採樣 輸出緩衝的隨機存取 “UUnnoorrddeerreedd AAcccceessss VViieeww”” ((UUAAVV)) 每個sshhaaddeerr都可以寫入任意位置到輸出緩衝
  33. 33. CCoommppuutteerr SShhaaddeerr TThhrreeaaddss 一個執行緒是CCSS最基本的處理單位 一個執行緒群組((tthhrreeaadd ggrroouupp))是一個三維的線程陣列 CCSS中可以宣告在一個群組中的執行緒數目 EE..gg.. [[nnuummtthhrreeaaddss((XX,, YY,, ZZ))]] 在同一個線程群組中的線程都執行相同的程序碼 要執行線程,, 就必須呼叫DDiissppaattcchh(( nnXX,, nnYY,, nnZZ )) 函式 nnXX,, nnYY,, nnZZ 代表了執行緒群組的數目
  34. 34. CCoommppuutteerr SShhaaddeerr DDaattaa ssiizzee :: 1122 xx 88 ppDDeevv1111-->>DDiissppaattcchh((33,, 22,, 11));; //// DD33DD AAPPII ccaallll [[nnuummtthhrreeaaddss((44,, 44,, 11))]] //// CCSS 55..00 HHLLSSLL TToottaall tthhrreeaaddss = 33**22**44**44 = 9966
  35. 35. TThhrreeaadd GGrroouupp SShhaarreedd MMeemmoorryy 在執行緒之間分享 可以將之視為專為執行緒設計的高速本地記憶體 在sshhaaddeerr中宣告 ggrroouuppsshhaarreedd ffllooaatt44 vvCCaacchheeMMeemmoorryy[[11002244]];; 上限大小是3322 KKBB 可以讀寫任何位置 由執行緒寫入的資料要讀回前必須要做執行緒同步 確保所有資料都已經正確寫入 GGrroouuppMMeemmoorryyBBaarrrriieerr(());; GGrroouuppMMeemmoorryyBBaarrrriieerrWWiitthhGGrroouuppSSyynncc(());;
  36. 36. SShhaaddiinngg
  37. 37. FFoorrwwaarrdd SShhaaddiinngg ffoorr eeaacchh ddyynnaammiicc lliigghhtt ffoorr eeaacchh mmeesshh lliigghhtt iinntteerrsseeccttss rreennddeerr mmeesshh wwiitthh lliigghhttiinngg OO((MM**LL)) SShhaaddeerr單純,,每種光源一個sshhaaddeerr 材質屬性多樣化 MMuullttii--SSaammpplliinngg相容 動態光源數目很大時,,會產生GGeeoommeettrryy BBoouunndd
  38. 38. DDeeffeerrrreedd SShhaaddiinngg SSccrreeeenn SSppaaccee LLiigghhttiinn gg
  39. 39. DDeeffeerrrreedd SShhaaddiinngg ffoorr eeaacchh mmeesshh rreennddeerr mmeesshh ((GG--bbuuffffeerrss)) ffoorr eeaacchh lliigghhtt rreennddeerr lliigghhtt qquuaadd OO((MM++LL)) SShhaaddiinngg 跟GGeeoommeettrryy PPaassss分離 材質屬性有限制 MMuullttii--SSaammpplliinngg不相容 記憶體需求大
  40. 40. LLiigghhtt PPrree--PPaassss SShhaaddiinngg PPrree-- LLiigghhttiinngg RReennddeerr SScceennee
  41. 41. LLiigghhtt PPrree--PPaassss SShhaaddiinngg 22 GGeeoommeettrryy PPaasssseess ++ 11 LLiigghhttiinngg PPaassss 速度較DDeeffeerrrreedd SShhaaddiinngg慢一些 材質屬性變化大 記憶體需求低一些 不支援MMRRTT的硬體也適用
  42. 42. MMuullttii--SSaammpplliinngg
  43. 43. MMSSAAAA OOvveerrvviieeww
  44. 44. MMSSAAAA SSaammpplliinngg LLooccaattiioonn MMSSAAAA 22xx MMSSAAAA 44xx MMSSAAAA 88xx ffllooaatt22 MMSSAAAA__22xx = {{ {{--00..2255,, --00..2255}},, {{ 00..2255,, 00..2255}} }};; ffllooaatt22 MMSSAAAA__44xx = {{ {{--00..112255,, --00..337755}},, {{ 00..337755,, --00..112255}},, {{--00..337755,, 00..112255}},, {{ 00..112255,, 00..337755}} }};; ffllooaatt22 MMSSAAAA__88xx = {{ {{ 00..00662255,, --00..11887755}},, {{--00..00662255,, 00..11887755}},, {{ 00..33112255,, 00..00662255}},, {{--00..11887755,, --00..33112255}},, {{--00..33112255,, 00..33112255}},, {{--00..44337755,, --00..00662255}},, {{ 00..11887755,, 00..44337755}},, {{ 00..44337755,, --00..44337755}} }};;
  45. 45. MMSSAAAA ffoorr DDeeffeerrrreedd SShhaaddiinngg PPiixxeell FFrreeqquueennccyy PPaassss 利用SStteenncciill紀錄eeddggee ppiixxeellss RReennddeerr SScceennee SSaammppllee FFrreeqquueennccyy PPaassss 讀取SStteenncciill只計算eeddggee ppiixxeell 使用SSVV__SSAAMMPPLLEEIINNDDEEXX作ppeerr--ssaammppllee sshhaaddiinngg RReennddeerr SScceennee ttoo MMSSAAAA RRTT
  46. 46. MMSSAAAA ffoorr DDeeffeerrrreedd SShhaaddiinngg
  47. 47. MMSSAAAA ffoorr DDeeffeerrrreedd SShhaaddiinngg 1) Use of the ““ssaammppllee”” keyword ssttrruucctt PPSS__IINNPPUUTT {{ ssaammppllee ffllooaatt22 TTeexx11 :: TTEEXXCCOOOORRDD;; }};;  22)) SSeemmaannttiicc ddeeccllaarraattiioonn:: SSVV__SSAAMMPPLLEEIINNDDEEXX ssttrruucctt PPSS__IINNPPUUTT {{ ffllooaatt22 TTeexx22 :: TTEEXXCCOOOORRDD;; uuiinntt uuSSaammppllee :: SSVV__SSAAMMPPLLEEIINNDDEEXX;; }};;
  48. 48. PPoosstt--PPrroocceessssiinngg AAAA MMLLAAAA FFXXAAAA EEddggee ppiixxeellss ddeetteecctteedd bbyy MMLLAAAA ((iinn rreedd))EEddggee ppiixxeellss ddeetteecctteedd bbyy FFXXAAAA ((iinn rreedd))
  49. 49. GGaammmmaa CCoorrrreeccttiioonn
  50. 50. GGaammmmaa CCoorrrreeccttiioonn 美術產生的貼圖已做過GGaammmmaa CCoorrrreeccttiioonn,,資 料非lliinneeaarr 因此用來計算lliigghhttiinngg會產生誤差 正確作法應將貼圖的GGaammmmaa修正為lliinneeaarr 或是美術直接輸出lliinneeaarr貼圖 在PPiixxeell SShhaaddeerr中做sshhaaddiinngg 最後再將最後結果做一次GGaammmmaa CCoorrrreeccttiioonn後 輸出到螢幕上 新的GGPPUU都有支援硬體GGaammmmaa CCoorrrreeccttiioonn
  51. 51. GGaammmmaa CCoorrrreeccttiioonn tt eexx == tt eexx22DD(( SSiimmppll eerr,, TTeexxttuurree)) ;; tt eexx == ppooww(( tt eexx,, 22.. 22)) ;; ////DDoo tthhee ll ii gghhtt ii nngg…… rreettuurrnn ppooww(( oouutt ,,11//22.. 22)) ;; OORR 使用支援SSRRGGBB的貼圖及RRTT格式
  52. 52. GGaammmmaa CCoorrrreeccttiioonn
  53. 53. GGaammmmaa CCoorrrreeccttiioonn
  54. 54. WWee aarree hhiirriinngg!! GGaammee DDeessiiggnneerr 22DD AArrttiisstt CCoonnttaacctt :: oowweenn..wwuu@@qquubbiitteenntt..ccoomm
  55. 55. QQ&&AA oowweenn..wwuu@@qquubbiitteenntt..ccoomm

×