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

GLSLでパストレーシングしてコーネルボックスを出す

A7a5efde86e0137d32a93d8609b7a022?s=47 yumcyawiz
November 28, 2020

 GLSLでパストレーシングしてコーネルボックスを出す

OSK11月LT会のスライド
Github: https://github.com/yumcyaWiz/glsl-cornellbox

A7a5efde86e0137d32a93d8609b7a022?s=128

yumcyawiz

November 28, 2020
Tweet

Transcript

  1. GLSLでパストレーシングしてコーネルボックスを 出す OSK11月LT会 @yumcyawiz

  2. GLSLとは?

  3. GLSLとは? • OpenGLで使用されるシェーダー • ユーザー定義のグラフィクス処理を記述できる • 計算はGPUで行われる • 文法はCと似ている

  4. シェーダーの種類 • Vertex Shader • Fragment Shader • Geometry Shader

    • Tessellation Shader • Compute Shader
  5. シェーダーで処理する流れ Vertex Shader ポリゴン データ Fragment Shader 出力 頂点座標 テクスチャ座標など

    頂点座標をスクリー ン上の座標に変換 各画素の色を計算
  6. Vertex Shaderの例 vPosに頂点情報が入っている gl_Positionに座標変換した頂点情報が格納される

  7. GLSLでパストレ?

  8. GLSLでパストレ? • Vertex Shader -> Fragment Shaderの流れで自然にパストレを 組み込むのは不可能

  9. GLSLでパストレ • Vertex Shader -> Fragment Shaderの流れで自然にパストレを 組み込むのは不可能 画面一杯に四角形を表示して, Fragment

    Shaderでパストレする (レイマーチングと同じ方法)
  10. 四角形 + Fragment Shader Vertex Shader 画面を覆う四角形 Fragment Shader 各画素の色をパストレ

    で計算 3次元空間上に置かれた 四角形
  11. GPUレイトレ • 現在はOptiX, DirectX RayTracing, Vulkan RayTracingがあるの でGLSL縛りでレイトレする必要性はない 今回の主題: GLSLだけでどこまで実装できるのか?

  12. パストレの実装 in GLSL

  13. レイの表現 • vec3は最初から用意されている • classはないがCライクな構造体が利用できる

  14. カメラ • normalizeなどvec3の組み込み関数が使える • C++の場合と全く同じように実装できる

  15. 物体 • 物体情報を全部Structに押し込む • type=0(球), type=1(平面)

  16. 物体とのintersect • typeに応じてintersectの演算を切り替える

  17. シーンの表現 • Primitiveの配列をハードコーディング(本当はCPU側から渡し たほうが良い)

  18. シーンとのintersect • 線形探索(頑張ればBVHも組み込めるみたい)

  19. 乱数 • xorshift32を利用

  20. シード • 画素の位置, 現在のサンプル数をhash関数に通したものをシー ドに設定(アドホックだが見た目は悪くない)

  21. パストレ • これもCPUの場合と同様に実装できる • BRDFはDiffuse only

  22. サンプルの蓄積 • Framebufferを用意し, サンプル蓄積用のテクスチャにレンダリ ングする

  23. 結果の表示 • サンプル蓄積用のテクスチャをサンプル数で割ったものを画面 に表示

  24. 結果 実際に動いているところをお見せします

  25. Future Works • コードをもっと綺麗に書きたい • GUIを付ける • インタラクティブな操作を可能にする • BVHを組み込んでsponzaとかレンダリングしてみたい

    • Disney BRDF • NEE, MIS, BDPTなども実装してみる
  26. Thank you for listening!