OSK11月LT会のスライド Github: https://github.com/yumcyaWiz/glsl-cornellbox
GLSLでパストレーシングしてコーネルボックスを出すOSK11月LT会 @yumcyawiz
View Slide
GLSLとは?
GLSLとは?• OpenGLで使用されるシェーダー• ユーザー定義のグラフィクス処理を記述できる• 計算はGPUで行われる• 文法はCと似ている
シェーダーの種類• Vertex Shader• Fragment Shader• Geometry Shader• Tessellation Shader• Compute Shader
シェーダーで処理する流れVertex ShaderポリゴンデータFragmentShader出力頂点座標テクスチャ座標など頂点座標をスクリーン上の座標に変換各画素の色を計算
Vertex Shaderの例vPosに頂点情報が入っているgl_Positionに座標変換した頂点情報が格納される
GLSLでパストレ?
GLSLでパストレ?• Vertex Shader -> Fragment Shaderの流れで自然にパストレを組み込むのは不可能
GLSLでパストレ• Vertex Shader -> Fragment Shaderの流れで自然にパストレを組み込むのは不可能画面一杯に四角形を表示して, Fragment Shaderでパストレする(レイマーチングと同じ方法)
四角形 + Fragment ShaderVertexShader画面を覆う四角形FragmentShader各画素の色をパストレで計算3次元空間上に置かれた四角形
GPUレイトレ• 現在はOptiX, DirectX RayTracing, Vulkan RayTracingがあるのでGLSL縛りでレイトレする必要性はない今回の主題: GLSLだけでどこまで実装できるのか?
パストレの実装 in GLSL
レイの表現• vec3は最初から用意されている• classはないがCライクな構造体が利用できる
カメラ• normalizeなどvec3の組み込み関数が使える• C++の場合と全く同じように実装できる
物体• 物体情報を全部Structに押し込む• type=0(球), type=1(平面)
物体とのintersect• typeに応じてintersectの演算を切り替える
シーンの表現• Primitiveの配列をハードコーディング(本当はCPU側から渡したほうが良い)
シーンとのintersect• 線形探索(頑張ればBVHも組み込めるみたい)
乱数• xorshift32を利用
シード• 画素の位置, 現在のサンプル数をhash関数に通したものをシードに設定(アドホックだが見た目は悪くない)
パストレ• これもCPUの場合と同様に実装できる• BRDFはDiffuse only
サンプルの蓄積• Framebufferを用意し, サンプル蓄積用のテクスチャにレンダリングする
結果の表示• サンプル蓄積用のテクスチャをサンプル数で割ったものを画面に表示
結果実際に動いているところをお見せします
Future Works• コードをもっと綺麗に書きたい• GUIを付ける• インタラクティブな操作を可能にする• BVHを組み込んでsponzaとかレンダリングしてみたい• Disney BRDF• NEE, MIS, BDPTなども実装してみる
Thank you for listening!