Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ラスタライザとレイトレのハイブリッドレンダリングエンジン

 ラスタライザとレイトレのハイブリッドレンダリングエンジン

自作のレンダリングエンジンに関する、社内勉強会の資料です。

TakayukiKiyohara

September 09, 2022
Tweet

Other Decks in Programming

Transcript

  1. ラスタライザとレイトレのハ イブリッドレンダリングエン ジン 株式会社サイバーエージェント 2022.09.09 清原 隆行

  2. はじめに Chapter : 00

  3. はじめに リアルタイムレイトレが発表されてから、コンソールゲーム機の世界ではリアルタイムレイトレを活用したタ イトルがどんどん発表されてきています。また、最近のニュースを見ていると、リアルタイムレイトレの足音 はモバイルの世界にも聞こえてきているように思います。 このLTではリアルタイムレイトレをオリジナルエンジンに組み込んで得た知見や、CEDECなどで発表されてい る実例も踏まえて、現時点でのレイトレの活用のされかたを話していけたらと思います。 概要

  4. はじめに オリジナルエンジンでレイトレが動いている様子 環境 • CPU : Intel Core i7-11800H •

    GPU : RTX 3070 Laptop • メモリ : 32GB • OS : Windows10/11 • Graphics API : DirectX12
  5. はじめに • Chapter-1 リアルタイムレイトレの発表~現在まで • Chapter-2 シンプルなレンダリングエンジン(ラスタライザ法) • Chapter-3 GPUパイプライン(ラスタライザ法)

    • Chapter-4 複雑なレンダリングエンジン(ラスタライザ法) • Chapter-5 シンプルなレンダリングエンジン(レイトレ―ス法) • Chapter-6 GPUパイプライン(レイトレ―ス法) • Chapter-7 ハイブリッドレンダリングエンジン 目次
  6. リアルタイムレイトレの発表~現在まで Chapter : 01

  7. リアルタイムレイトレの発表~現在 • 2018年3月19日、GDC2018にて米MicrosoftからDirectX Raytracingが発表 [1] DirectX12のリアルタイムレイトレーシングを行うための拡張APIとして、 DirectX Raytracing( DXR )が発表される

    • 同日、米Nvidiaからリアルタイムレイトレーシング技術を提供するNVIDIA® RTXが発表 [2] DXRの発表と同日にハードウェアレイトレーシングを行うための専用のRTCoreを搭載したGPUが 発表される • 2018年9月20日、GeForce RTX 20シリーズが発売 • 2018年10月2日、Windows 10 October 2018 UpdateにてDXR正式対応が発表 [3] 翌日の10月3日より、配信が開始され利用可能となる • 2018年11月半ば、Battlefield Vのアップデートにて、DXRファーストリリース版が配信 DirectX Raytracingの発表から、対応タイトル発売まで
  8. リアルタイムレイトレの発表~現在 • 2020年3月16日、Xbox seriesXのレイトレ対応とアーキテクチャが公開 [6] 米Microsoftのブログにて、Xbox seriesXのGPUコアがAMD RDNA 2 アーキテクチャベースのも

    のであると公開される [6] • 2020年3月19日、Play Station5の基本スペック公開 [5] PS5のGPUのコアはAMD RDNA 2アーキテクチャベースのものであると発表されている • 2020年10月28日、リアルタイムレイトレーシングをサポートするRadeon RX 6000シリーズを発表 [4] 「AMD RDNA 2 アーキテクチャ」を採用するGPUを発表。ハードウェアレイトレーシングに対応 AMDとコンソールゲーム機の対応
  9. リアルタイムレイトレの発表~現在 • 2018年6月、WWDC2018にてMPS(Metal Performance Shader)を利用したレイトレ―サーが公開 [7] ハードウェアレイトレーシングではなく、コンピュートシェーダーを利用したソフトウェアレイト レ―シングが公開された • 2020年3月17日、Valukanのハードウェアレイトレ対応が発表

    [8] 4月8日暫定版「Vulkan Ray Tracing」が公開された • 2022年6月6日、WWDC2022にてMetal3において、よりモダンなレイトレ対応が発表 NVIDIA、AMDなどが実現しているハードウェアレイトレーシングと同等の仕組みを、Metal3で実 装することを発表した。 • 2022年6月、Armから初のハードウェア・レイトレーシング対応GPU「Immortalis」が発表される [9] 他API(Valukan、Metal)とスマホのレイトレ対応
  10. リアルタイムレイトレの発表~現在 • DLSS(Deep Learning Super Sampling) GeForce RTX™ GPU にのみに搭載されている専用の

    Tensor コア AI プロセッサ使用してのアップ スケーリングAA [10] • FSR(FidelityFX Super Resolution) 2021年6月22日にてAMDから公開された [11] • MetalFX Upscaling 2022年6月、WWDC2022にてDLSS、FSRライクなのアップスケーリングAAが発表された [12] Upscaling AA
  11. シンプルなレンダリングエンジン(ラスタライ ザ法) Chapter : 02

  12. シンプルなレンダリングエンジン(ラスタライザ法) ・ゲームループ ・レンダリングエンジン ・ドローコール 必要な要素

  13. シンプルなレンダリングエンジン(ラスタライザ法) ほぼすべてのゲームには、一 定の周 期でループする ゲームループと 呼ばれるものが存 在しています。こ のループのなかで、ゲーム 内 のオブジェクトの

    状 態 の更新処理や描画処理が行われています。 Unityにおいて、このゲームループの実装は強烈に隠 蔽されていて、ゲームループの根本の処理を変更す ることはできません。 ゲームループ
  14. シンプルなレンダリングエンジン(ラスタライザ法) レンダリングエンジンとは1フレームの 絵 を 作 るた めのGPUの絵を作 成するための、GPUに対する命 令 となる描画コマンド(ドローコール)を生成するもので

    す。このサンプルプログラムでは、ゲームオブジェ クトのDraw関数を呼び出している箇所がレンダリン グエンジンと言えます。この関数の内部で描画コマ ンドを作成しています。 レンダリングエンジン レンダリングエンジン
  15. シンプルなレンダリングエンジン(ラスタライザ法) 次 のサンプルコードは 先 ほどのゲームオブジェクト のDraw()関数とUpdate()関数の疑似コードです。 かなりUnityに寄せた疑似コードとなっています。 このUpdate() 関 数

    では、ゲームオブジェクトのワー ルド空間での座標、回転、拡大率からワールド行列 を計算しています。 Draw()関数では_meshRendererというメッシュをレ ンダリングするためのコンポーネントを 保 持 してい たら、_meshRendererのDraw()関数を呼び出してい ます。 GameObjectの中身の疑似コード
  16. シンプルなレンダリングエンジン(ラスタライザ法) 次の疑似コードは先ほどの_meshRendererのDraw()関数 の中身です。DirectX12のAPIを利用してメッシュを描画 するための描画コマンドを作成しています。 この描画コマンドがGPUに送られると、GPUが絵を描く仕 事を開始します ドローコール

  17. シンプルなレンダリングエンジン(ラスタライザ法) • 定数バッファの更新 ◦ メッシュ共通のワールド行列など、その他も ろもろ ◦ マテリアル個別のものもある • プリミティブトポロジーの設定

    • 頂点バッファ/インデックスバッファの設定 • マテリアルごとのリソースの設定 ◦ ディスクリプタヒープ • GPUパイプラインの設定 ◦ Zテスト/アルファブレンディング/カリング シェーダーなどの設定 ドローコールのための最低限の設定
  18. GPUパイプライン(ラスタライザ法) Chapter : 03

  19. GPUパイプライン(ラスタライザ法) • 一つのドローコールを受けてから、絵を表示するまでの一連のGPUが行う仕事のこと • レンダリングパイプライン、グラフィックスパイプラインとも呼ばれる ◦ Unityにおいてレンダリングパイプラインは別のことを指しているので注意が必要(後述) GPUパイプライン

  20. GPUパイプライン(ラスタライザ法) 1. 入力アセンブラ 2. 頂点シェーダー 3. ハルシェーダー 4. ドメインシェーダー 5.

    テッセレータ― 6. ジオメトリシェーダー 7. ラスタライザ 8. ピクセルシェーダー 9. アウトプットマージャー DirectX12におけるGPUパイプライン テッセレーションと頂点増減の ためのステージ。 詳細は割愛します。
  21. GPUパイプライン(ラスタライザ法) 頂 点 バッファ、インデックスバッファ、プリミ ティブのトポロジーの 情 報 から、プリミティブを 構成する頂点データを読み込んで頂点シェーダー に渡すステージ。

    下記の関数がInput Assemblerのための関数。 • _commandList.IASetPrimitive() • _commandList.IASetVertexBuffer() • _commandList.IASetIndexBuffer() 入力アセンブラ( Input Assembler )
  22. GPUパイプライン(ラスタライザ法) 入力アセンブラから受け取った頂点情報を使って、頂点 の座標変換を行い、2D画面上のどこに描画されるのか を計算するプログラマブルステージです。 正確には頂点シェーダーではローカル座標系⇒ワールド 座標系⇒カメラ座標系⇒クリップ座標系までの変換を行 います。 このクリップ座標系は3D空間となっており、クリップ座 標系⇒正規化デバイス座標系⇒ビューポート座標系(2D 空間)への変換はハードウェア(後述するラスタライザ)が

    行うため、プログラミングはできません。 頂点シェーダー 正規化デバイス座標系
  23. GPUパイプライン(ラスタライザ法) ラスタライザの仕事は下記のように多岐にわたります。 • プリミティブ(ポリゴン)の頂点座標をクリップ空間からビューポート空間に変換 • ポリゴンの頂点座標から塗りつぶすピクセルを決定するラスタライゼーション • シザー矩形からはみ出すピクセルを除去するクリッピング処理 • ピクセルシェーダーに渡すための頂点データの線形補間

    ラスタライザ
  24. GPUパイプライン(ラスタライザ法) 抽象的な幾何学データからドットの集合であるラスタイメージに変換する処理です。 ラスタライゼーション

  25. GPUパイプライン(ラスタライザ法) 頂点シェーダーから出力されたデータをピクセルシェーダーに渡すために計算する処理です。 頂点データの線型補間 3頂点のデータから各 ピクセルシェーダーに 渡すデータを計算する

  26. GPUパイプライン(ラスタライザ法) ラスタライザで 決 定 された 塗 りつぶすためのピクセルのカ ラーを 決 定

    するためのプログラマブルステージです。プログ ラマブルシェーダーの花形スター選手です。 GLSLやUnityではフラグメントシェーダーと 呼 ばれていま す。 ピクセルシェーダー
  27. GPUパイプライン(ラスタライザ法) GPUパイプラインの最後のステージです。ピクセルシェーダーを通過して決まったピクセルカラーをレンダリ ングターゲットにどのように合 成するか?そもそも合 成するのか?を決めるステージです。合 成 方 法はアル ファブレンディング、合成するかどうかはZテスト、ステンシルテストを行うことで決定されます。 アウトプットマージャー(

    Output Merger )
  28. 複雑なレンダリングエンジン(ラスタライザ法) Chapter : 04

  29. 複雑なレンダリングエンジン(ラスタライザ法) 1. プリレンダリング a. レンダリングに必要な事前データの作成などを行う。 2. レンダリング a. 実際の描画処理。シンプルなレンダリングエンジンはここの部分だけ。 3.

    ポストエフェクト a. 2で出来上がった絵に対して、エフェクトをかけていく。カメラアプリの画像加工をイメージする と良い。 4. HUD a. ポストエフェクトをかけたくない2Dなどをレンダリングする。3と4を入れ替えると2Dにまで ポストエフェクトがかかるので注意! forwardレンダリングの典型的な処理
  30. 複雑なレンダリングエンジン(ラスタライザ法) • シャドウマップの作成 ◦ 影生成 • ZPrepass ◦ のちのレンダリングのパスで 無

    駄 なピクセル シェーダーを 走 らせないためにZバッファを 先 に作ってしまう。 • 速度マップの作成 ◦ モーションブラー プリレンダリング
  31. 複雑なレンダリングエンジン(ラスタライザ法) • 不透明オブジェクトの描画 ◦ 不透明オブジェクトは半透明オブジェクトよりも 先に描画する ▪ 深度テストで問題が起きるので • 加算オブジェクトの描画

    • 半透明オブジェクトの描画 ◦ 奥から手前に描画 レンダリング
  32. 複雑なレンダリングエンジン(ラスタライザ法) • トーンマップ • ブルーム • 被写界深度 • スクリーンスペースリフレクション •

    アンチエイリアス ポストエフェクト
  33. 複雑なレンダリングエンジン(ラスタライザ法) HUDの描画を加えた最終的なレンダリングエンジン

  34. シンプルなレンダリングエンジン(レイトレ― ス法) Chapter : 05

  35. シンプルなレンダリングエンジン(レイトレ―ス法) はじめに このチャプターでは2次 反 射を行わない、シンプ ルなレンダリングエンジンを見ていきます。 今回扱うエンジンは、「ライティングを行わない モデル表示を行って、背景は黒にする」という非 常にシンプルなものになっています。

  36. シンプルなレンダリングエンジン(レイトレ―ス法) アルゴリズム概要 1. レイトレワールド(3Dモデルのポリゴン の集合だと思ってください)を構築 2. カメラからスクリーンのピクセルに 向 かってレイを飛ばす 3.

    飛 ばしたレイとレイトレワールドとの 衝 突判定 4. 衝突した場合は計算したサーフェースの カラーをピクセルのカラーとして表示 5. 衝 突しなかった場 合はピクセルカラーを 黒とする
  37. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築 レイトレワールドはワールド座 標 系での3Dモ デルのポリゴン情報を元に構築することができ ます。 この三角形の集合となるレイトレワールドとカ メラから飛ばしたレイとの交差判定を行うこと

    でレイトレースを行っていきます。 Nsight graphicsを利用してキャプチャし たレイトレワールドの様子
  38. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築(ジオメトリ情報の登録) このコードはDXRの機能を使って、レイトレ ワールド構 築のために3Dモデルのジオメト リ情報を設定しているコードの一部です。

  39. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築(二つの高速化構造の構築) シーンのジオメトリ情報の登録ができたら、レイとメッシュ(ポリゴンの集合)との当たり判定を高速化するた めに、次の二つの高速化構造を構築します。 1. BLAS(Bottom Level Acceleration Structure)

    2. TLAS(Top Level Acceleration Struc ture) これらの高速化構造の多くはブラックボックスになっていますが、二つとも当たり判定を高速化するために、 BVH( Bouding Volume Hierarchy )を構築しています。
  40. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築(BVHとは) BVHは軸並行バウンディングボックス( AABB ) を使って、空間を分割した2分木のデータ構造です。BVHを利 用することによって、レイとメッシュの当たり判定の計算量オーダーをO(N)からO(logN)に近づけることがで きます。 また、空間を分割してツリー構造を作成するアルゴリズムとしてはBVH以外にも下記のようなものがありま

    す。 • KD木 • BSP木(Binary Space Partitioning) ◦ https://github.com/KawaharaKiyohara/k2Engine/blob/master/GameTemplate/k2EngineLo w/geometry/BSP.cpp
  41. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築(BLASのBVH) BLASのBVHはインスタンスのジオメトリ情報を元に構築されています。 Root Node Leaf Leaf Leaf Leaf

    Leaf Leaf Node Node Node Node
  42. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築(TLASのBVH) TLSAのBVHはインスタンスの集合によって構築されています。 Leaf Leaf Leaf Leaf Node Node

    Root Node
  43. シンプルなレンダリングエンジン(レイトレ―ス法) 1. レイトレワールドの構築 下記のURLはDXRの機能を使ってBLASとTLASを構築している自作エンジンのコードで す。 • https://github.com/KawaharaKiyohara/k2Engine/blob/master/GameTempla te/k2EngineLow/graphics/raytracing/BLASBuffer.cpp • https://github.com/KawaharaKiyohara/k2Engine/blob/master/GameTempla

    te/k2EngineLow/graphics/raytracing/TLASBuffer.cpp
  44. シンプルなレンダリングエンジン(レイトレ―ス法) 2. カメラからスクリーンのピクセルに向かってレイを飛ばす(ディスパッチ) レイトレワールドの構築ができたら、レイを飛 ばす命令のディスパッチコードを実行します。 ディスパッチコールを実行されることで、レイ トレのGPUパイプラインが実行されます

  45. シンプルなレンダリングエンジン(レイトレ―ス法) 2. カメラからスクリーンのピクセルに向かってレイを飛ばす(レイジェネレーショ ンシェーダー) CPU側からレイのディスパッチコールが実行さ れるとレイトレのGPUパイプラインが動き出し ます。レイトレのGPUパイプラインの最初の仕 事 はレイを 生

    成 するレイジェネレーション シェーダーの実行です。 レイジェネレーションシェーダーはディスパッ チされたレイの本数分実行されます。
  46. シンプルなレンダリングエンジン(レイトレ―ス法) 3. 飛ばしたレイとレイトレワールドとの衝突判定 TraceRay()を呼び出すことでハードウェア的に実行される。プログラミングはできません。 衝突判定はTLAS、BLASを利用して行われます。 レイとポリゴンの衝突の有無でGPUパイプラインは分岐します。

  47. シンプルなレンダリングエンジン(レイトレ―ス法) 4. 衝突した場合は計算したサーフェースのカラーをピクセルのカラーとして表示 衝突した場合は、closesthitシェーダー(最も近いヒットシェーダー)が呼ばれるので、そこで衝突情報からテ クスチャカラーをサンプリングして、ピクセルカラーとして出力している。

  48. シンプルなレンダリングエンジン(レイトレ―ス法) 5. 衝突しなかった場合はピクセルカラーを黒とする レイとポリゴンが衝突した場合は、missシェーダーが呼ばれるので、そこでピクセルカラーを黒として実行し ている。

  49. GPUパイプライン(レイトレ―ス法) Chapter : 06

  50. GPUパイプライン(レイトレ―ス法) ラスタライザ法のGPUパイプラインとの違い Chapter05で見たように、レイトレース法のGPUパイプラインはラスタライザ法のパイプラインと仕事が全く 異なります。レイトレース法のパイプラインの仕事は下記のようになります。 1. Ray Generation Shader 2. Traversal(交差判定処理)

    3. Closest Hit Shader 4. Any Hit Shader 5. Intersection Shader 6. Miss Shader Hit Group
  51. GPUパイプライン(レイトレ―ス法) ラスタライザ法のGPUパイプラインとの違い レイトレース法のGPUパイプラインは処理の分岐も発生するため、ラスタライザ法と比べると、フローも複雑 になります。 Ray Generation Shader Traversal Miss Shader

    Closest Hit Shader TraceRay() TraceRay() 不透明 オブジェクト? No Any Hit Shader Yes 三角形ポリゴン? No Intersection Shader 組み込みの交 差判定 Yes
  52. GPUパイプライン(レイトレ―ス法) 先ほどのGPUパイプラインを見ると分かりますが、頂点シェーダーに該当する頂点処理のステージがレイトレ のパイプラインには存在していません。正確には、インスタンスに設定されているワールド行列を使って、ハー ドウェアが頂点をワールド空間に変換してくれていますが、ラスタライザ法の頂点シェーダーでやっているよう なスキニングを行うことはできません。そこで今回はコンピュートシェーダーを利用してアニメーション済みの 頂点バッファを計算してから、ディスパッチするという方法で実装しました。 アニメーションはどうするの?

  53. ハイブリッドレンダリングエンジン Chapter : 07

  54. ハイブリッドレンダリングエンジン レイトレ vs ラスタライザ 完全なレイトレ―サーのレンダリングエンジンを作ることもできる ⇒しかしラスタライザに比べると重い ⇒しかもラスタライザで十分な品質を確保 or ラスタライザの方が得意な部分も多い ⇒ラスタライザが苦手な部分を補う使い方はどうか?

    ⇒『より速ければラスター、そうでなければレイを使って驚かせ』[14] ⇒レイトレとラスタライザのハイブリッドレンダリングエンジン
  55. ハイブリッドレンダリングエンジン レイトレが得意なもの • 鏡像反射 • 屈折 • ハードシャドウ 実装したのはこれ

  56. ハイブリッドレンダリングエンジン 鏡像反射 ラスタライザベースでの鏡 像 反 射は下 記のような手 法があ り、これらを組み合わせて鏡像を表現していますが、まだま だ完全な表現ができていません。

    • SSR • Plane Reflection • Reflection Probe レイトレであれば鏡像反射はとても簡単にクオリティの高い 表現を行うことができます。
  57. ハイブリッドレンダリングエンジン 最終的に出来上がったレンダリングエンジンのフロー(2022/9/9時点) Computed Animated Vertex ZPrepass Render To ShadowMap Light

    Culling Render G-Buffer Render ReflectionMap (Raytrace) Deferred Lighting Forward Rendring Post Effect Render 2D
  58. 参考文献 • [1] [GDC 2018]ついにDirectXがレイトレーシングパイプラインを統合。「DirectX Raytracing」が 立ち上がる • [2] NVIDIA

    RTX 技術がリアルタイムのシネマティック レンダリングの夢を実現 • [3] ゲーム表現の革新「DirectX Raytracing」が「October 2018 Update」で正式サポート - 窓の杜 • [4] AMD、リアルタイムレイトレーシング対応「Radeon RX 6000」シリーズ発表 「Big Navi」搭載、 579ドルから - ITmedia NEWS • [5]  PS5の基本スペックが公開。CPUはZen2(8コア16スレッド)3.5GHz(可変)、GPUは10.28 TFLOPs, 36 CUs at 2.23GHzに | ゲーム・エンタメ最新情報のファミ通.com • [6] Xbox Series X: A Closer Look at the Technology Powering the Next Generation • [7] Metal for Accelerating Ray Tracing | Apple Developer Documentation
  59. • [8] グラフィックスAPI「Vulkan」がリアルタイムレイトレーシングに対応。Windowsだけでなく, 【MacやLinuxでも利用可能に • [9] Arm、スマホ向け新型GPU「Immortalis」――ハードウェアレイトレーシングに対応 - ケータイ Watch

    • [10] ネイティブ超えの新DLSSを追加――NVIDIAが「GeForce Experience」をアップデート Radeonで も使える超解像技術も公開(2/2 ページ) - ITmedia PC USER • [11] 西川善司の3DGE:AMDの超解像技術「FidelityFX Super Resolution」は,DLSSのライバルとな り得るのか • [12] MetalFX Upscaling will bring DLSS-like image reconstruction to games on MacOS | Ars Technica • [13] DX12 Raytracing tutorial - Part 1 | NVIDIA Developer 参考文献
  60. • [14] Pocol(2021年)『Direct3D12 ゲームグラフィックス実践ガイド』技術評論社. • [15] 清原 隆行(2021年)『HLSLシェーダーの魔導書』翔泳社. • [16]

    Tomas Akenine-Moller、Eric Haines、Naty Hoffman『リアルタイムレンダリング 第4版』ボー ンデジタル. 参考文献