$30 off During Our Annual Pro Sale. View Details »

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

yumcyawiz
November 28, 2020

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

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

yumcyawiz

November 28, 2020
Tweet

More Decks by yumcyawiz

Other Decks in Programming

Transcript

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

    View Slide

  2. GLSLとは?

    View Slide

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

    View Slide

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

    View Slide

  5. シェーダーで処理する流れ
    Vertex Shader
    ポリゴン
    データ
    Fragment
    Shader
    出力
    頂点座標
    テクスチャ座標など
    頂点座標をスクリー
    ン上の座標に変換
    各画素の色を計算

    View Slide

  6. Vertex Shaderの例
    vPosに頂点情報が入っている
    gl_Positionに座標変換した頂点情報が格納される

    View Slide

  7. GLSLでパストレ?

    View Slide

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

    View Slide

  9. GLSLでパストレ
    • Vertex Shader -> Fragment Shaderの流れで自然にパストレを
    組み込むのは不可能
    画面一杯に四角形を表示して, Fragment Shaderでパストレする
    (レイマーチングと同じ方法)

    View Slide

  10. 四角形 + Fragment Shader
    Vertex
    Shader
    画面を覆う四角形
    Fragment
    Shader
    各画素の色をパストレ
    で計算
    3次元空間上に置かれた
    四角形

    View Slide

  11. GPUレイトレ
    • 現在はOptiX, DirectX RayTracing, Vulkan RayTracingがあるの
    でGLSL縛りでレイトレする必要性はない
    今回の主題: GLSLだけでどこまで実装できるのか?

    View Slide

  12. パストレの実装 in GLSL

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 乱数
    • xorshift32を利用

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. Thank you for listening!

    View Slide