Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unity名古屋セミナー [Shadowgun]

8,341 views

Published on

Unity名古屋セミナー 中級者向けセッション

Published in: Technology
  • Be the first to comment

Unity名古屋セミナー [Shadowgun]

  1. 1. 今時のモバイル環境のためのリッチコンテンツ制作ノウハウユニティ・テクノロジーズ・ジャパン合同会社 大前 広樹 Unity名古屋セミナー
  2. 2. Rewind 2011/App of 2011
  3. 3. 「リッチコンテンツ」のベンチマーク的ゲーム
  4. 4. http://beta.unity3d.com/assetstore/ ShadowgunSampleLevel.zip
  5. 5. 無料でダウンロード可能同梱のシェーダーは商用利用可能
  6. 6. 1.ハードを知ろう2. ライティングをうまくやろう3. 余ってるパワーをうまく使おう
  7. 7. ハードを知ろう
  8. 8. • ShadowGunのターゲット • iPhone4 • iPad, iPad2 • Tegra2以上のAndroid • Tegra3積んでたら色々おまけ処理• http://www.youtube.com/watch? v=QmvJxbHWZSU&feature=player_embedded
  9. 9. • だいたいGPUネック、ときどきCPUネック (ShadowGunではiPad2のみCPU、ほかはGPU)• 大体フラグメントシェーダ• 頂点処理、頂点数が問題になることはほとんどない• メモリは沢山あるけど、バスは遅い• Power-VR系はソート順ほとんど意味なし• Aderno, Tegraはソート順はパフォーマンスにかな り影響(手前から描こう)
  10. 10. あと、よくある間違いうっかりPC用のシェーダを使ってしまっている
  11. 11. • まずは、モバイル向けのシェーダに限定 しよう
  12. 12. Basic GPU optimizations• Use simplest possible fragment shaders (vertex shaders are usuallynot problem)• Shader variables precision is very important (smaller precision ->faster shaders) – beware of artifacts however• Rendering order is important (especially on non-PowerVR GPUs) :try render back -> front• You can utilize shader tag ‘queue’ to enforce rendering orderglobally : ie. skybox goes last, weapon in 1st person view first• Sometimes, rearranging math expressions in shaders can havesignificant effect – so don’t be afraid to experiment  Bootcamp Asia 2012 06/26/12 Page 9
  13. 13. • Fragment Shaderを出来る限りシンプルにする• 頂点シェーダは大体において余っている(ので、エキ ストラでアレコレやりたいときに使える)• 描画順は意外と重要(特にPower-VR以外のGPUでは)• Queueを使って描画の順番を整理しよう• シェーダ内で計算順序を入れ替えてみると、結構イン パクトがある場合があるので、恐れず実験しよう!
  14. 14. • フラグメントシェーダを軽くするには?• Precision超重要• 計算順もたまに変えてみよう
  15. 15. Precisionとは浮動小数点の精度のこと
  16. 16. float より精確 half fixed より速いhttp://http.developer.nvidia.com/Cg/fp20.html
  17. 17. 結論:可能な限りfixedを使う
  18. 18. ライティングを上手くやろう
  19. 19. ShadowGunが綺麗なのはライティングを頑張った結果
  20. 20. 使えるもの 静的なライト(ライトマップ)動的なライト効果を軽く済ませる方法 ライトプローブ、疑似スペキュラ ちょっといい影のつけかた
  21. 21. Lighting in Shadowgun• Lighting has major impact for overall game look. GI makesalmost any graphics assets look nice • We use lightmaps for static world geometry• For dynamic objects ‘light probes’ are utilized : result isconsistent lighting for all surfaces (we have about ~500 lightprobes per level, 3.5m spacing)• There is usually one 1024x1024 lightmap per level• Lightmaps are NOT compressed because of artifacts Bootcamp Asia 2012 06/26/12 Page 10
  22. 22. • グローバルイルミネーションさえ当てれば、大 抵のモデルは綺麗に見える:)• 静的なものはコスト安く、ライトマップで対応• 動的に動くものはライトプローブを使う• ライトマップは綺麗に見せたいので非圧縮
  23. 23. GI lightmaps + probes Bootcamp Asia 2012 06/26/12 Page 11
  24. 24. • ライトマップの問題点 • ディフューズカラーはいいが、スペ キュラがないのでメタル感が出ない
  25. 25. Specular lighting• Precomputed lighting is perfect for diffuse lighting component• Specular (view dependent) component however poses a problem(solutions exists but not viable on current mobile platforms)• This is where we start to cheat: • We precompute ‘specular lighting cubemap’ (this is just set of artists defined directional light projected to low-res cubemap) • In runtime, we use this cubemap as standard environment map (additive) • Artists create different specular cubemaps for different parts of level• To make this fake specular lighting consistent with lightmapped geometrywe just modulate it with lightmap (yes, this has no physical basis, but looksOK) Bootcamp Asia 2012 06/26/12 Page 12
  26. 26. • スペキュラライティング自体はあるが、 ダイナミックライトの計算は重すぎる• Cubemapを使って、フェイクなスペキュ ラをつける
  27. 27. • フェイク・キューブマップの作り方 • アーティストに頼んで、適当なライティングで場所・ 場所に合ったキューブマップをいくつか作ってもらう • 特定のエリアに入ったら、そのキューブマップを使っ て環境マップ処理をする • スペキュラがライトマップとあまり矛盾しないように イイ感じに調整(人力)
  28. 28. Cubemap based specular lighting Cubemap used for fake specular lighting Bootcamp Asia 2012 06/26/12 Page 13
  29. 29. Cubemap based specular lighting No specular lighting Bootcamp Asia 2012 06/26/12 Page 14
  30. 30. Cubemap based specular lighting Cubemap based specular lighting Bootcamp Asia 2012 06/26/12 Page 15
  31. 31. • ハイライト • スペキュラがどういう感じに素材に当 たるかの計算
  32. 32. • 普通のやり方だと、アルファ成分に入れ る
  33. 33. Glossiness mask “trick”• For glossy surfaces we usually use some kind of mask, which defines actualglossiness• Common approach is to use alpha channel of diffuse texture to storeglossiness Diffuse tex RGB Diffuse tex A (glossiness) Bootcamp Asia 2012 06/26/12 Page 16
  34. 34. • PVRTC4bitで、アルファあり・なしの違 いで、大分クオリティが変わってしまう
  35. 35. Glossiness mask “trick”• Using additional texture channel for glossiness however has drawbacks: • Increased memory requirements (4 bpp vs 8 bpp for DXT1 / DX5) • Significant quality degradation on some platforms (PVRTC) 4 BPP PVRTC with alpha 4 BPP PVRTC without alpha Bootcamp Asia 2012 06/26/12 Page 17
  36. 36. • ディフューズカラーからハイライト率を はじき出すための計算をする• どのカラーを強く出すかのためのバイア スをかけるベクターを用意
  37. 37. Glossiness mask “trick”• So what we do is following. Instead of just taking: •glossinesMask = tex2D(DiffuseTex,uv).a• We calculate: •glossinesMask = dot(tex2D(DiffuseTex,uv),CustomGlossExtractionWeights) • We have introduced four component vector CustomGlossExtractionWeights which basically defines how diffuse texture channels get combined to create glossiness mask. • This way we can have textures which defines glossiness purely by alpha channel (weights = (0,0,0,1)) or for example luminance of RGB channels (weights = (0.3,0.6,0.1,0)) • Those weights don’t have to be normalized, so they control ‘specular strength’ also Bootcamp Asia 2012 06/26/12 Page 18
  38. 38. Diffuse texture Red Green Blue Green * WeightGRed * WeightR Blue * WeightB Glossiness mask Page 19
  39. 39. とはいうモノの・・・
  40. 40. サンプルでやってないじゃん・・・orz
  41. 41. ただ、有効なテクニックであることは まちがいない
  42. 42. ライトプローブ
  43. 43. GI lightmaps + probes Bootcamp Asia 2012 06/26/12 Page 11
  44. 44. • Unity 3.5から使える機能• ライトマップを焼くときに、動的なオ ブジェクトのためにGIライトを当てら れる仕掛け• 沢山置けばおk
  45. 45. ・・・・・
  46. 46. • とにかく、恥ずかしげもなくGIつきライ トマップ+ライトプローブから始める• アンビエントオクルージョンもライト マップ作成時に焼く
  47. 47. • 無料版でも、ライトマップは使える(G Iの焼き付けは有料版のみ)• 無料版でも、アンビエントオクルージョ ンの焼き付けは出来る=存在感のある絵 作りが可能! やってみて!
  48. 48.
  49. 49. • ShadowGunでは、影はいわゆる「丸 影」• でもそれだと味気ないので、「丸影 2.0」を実装
  50. 50. Character shadows• In most cases, we should be fillrate bound• So we should have some spare vertex processing available, which can beused to make blob shadows better• Basic idea is to approximate character using spheres and calculateanalytically expressed ambient occlusion (AO) between spheres andground plane in vertex shader (for Shadowgun, we use 3 spheres : leftfoot, right foot, pelvis)• Even if derivation of sphere vs plane AO closed form expression is nottrivial, result is surprisingly simple and efficient. For further informationsee Iñigo Quilez (Iq / RGBA demogroup) website as he is the author offormulas we use. Bootcamp Asia 2012 06/26/12 Page 21
  51. 51. • シェーダは大体フィルが遅い(ということ は・・)• 3つの球からAOを計算して、頂点シェー ダで動的にテッセレートしたメッシュで 描画
  52. 52. 影AOの計算 地面
  53. 53. 動的にテッセ レートされた 丸影メッシュBootcamp Asia 2012 06/26/12 23
  54. 54. Bootcamp Asia 2012 06/26/12 24
  55. 55. サンプルないじゃん・・・
  56. 56. ゴッドレイ
  57. 57. Volumetric FX Bootcamp Asia 2012 06/26/12 Page 27
  58. 58. ボリュームライトやゴッドレイのようなもの
  59. 59. Volumetric FX – optimizing fillrate (1)• First step is to use the simplest possible fragmentshader• In many cases, we don’t even need to sampletexture • Just procedurally calculate intensity per vertex (it is some kind of gradient in most cases anyway) • If it doesn’t look smooth enough … • … just use more vertices Bootcamp Asia 2012 06/26/12 Page 28
  60. 60. • ポリゴンとテクスチャ、加算合成で表現 (昔ながらのテクニック)• とにかくここでも、出来るだけシンプルなフラ グメントシェーダを使う• そのうえで、どうやったら画面に描画されるピ クセル数が少なくなるかを考える
  61. 61. Volumetric FX – optimizing fillrate (2)• Second step is to limit number of pixels we throw toscreen• Decrease transparency as viewer is moving closer tosurface• Once transparency is close to zero …• Start to shrink surface • shrink direction is controlled via normals • takes place in vertex shader• Eventually surface tris degenerate to lines and thus don’tgenerate any pixels to rasterize Bootcamp Asia 2012 06/26/12 Page 29
  62. 62. • 一般的に、描画されるサイズはカメラが 対象に近づいたら大きくなる• 描画サイズが大きくなると負荷が高くな る
  63. 63. 法線方向 エッジの片方をカメラが近づいたときにぐーっと動かす (頂点シェーダ)
  64. 64. MADFINGER-god-rays.shader
  65. 65. 結論頂点シェーダは余りがちなのでいろいろ遊べる余地があるよ!
  66. 66. Q&A
  67. 67. おわり

×