見出し画像

Vulkan+glslでレイマーチング03 & 雑談

恒例の?進捗報告です

Vulkan + glslでレイマーチング

前回に引き続き、Vulkanでレイマーチングをやっています。
動画を直接埋め込めないので、ツイッターのリンクを貼りました↑

ちなみに前回は↓

今回やったこと

・距離関数を追加して複数オブジェクトを表示
・チェック模様を追加
・座標系が統一されてなかったので統一(右手系Y-up)
・カメラ回転
・不具合修正

今回はVulkanっぽいことはやっていないですね。ほとんどglslでした。コードは↓にあがっています。

距離関数を追加して複数オブジェクトを表示

距離関数は↓のサイトを参考にしました。

複数オブジェクトの出し方は↓を参考に

チェック模様を追加

こちらもwgld.orgさんを参考に↓

自分の実装ではちょっとだけアレンジしました

float u = (floor(mod(pos.x * 4.0, 2.0)) - 0.5) * 2; // -1 or 1 の範囲に変換
float v = (floor(mod(pos.y * 4.0, 2.0)) - 0.5) * 2;
float w = (floor(mod(pos.z * 4.0, 2.0)) - 0.5) * 2;
vec3 albedo = mix(vec3(0.9, 0.5, 0.8), vec3(0.45, 0.25, 0.4), u*v*w);

座標系が統一されてなかったので統一(右手系Y-up)

ごちゃってたので統一しました。ごちゃってた理由は、vulkanのスクリーン座標系が画面右上を(0,0)とし、左下にむかって値が増えていくという仕様を無視していたからでした…。

カメラ回転

なんてことはない、ただの回転行列です。カメラ位置はCPU制御で決定してUniformでシェーダーに渡しています。よって、回転もC++で書いています。今回唯一のVulkan要素かもしれません。

不具合修正

オブジェクト同士が交差するポイントでレイの衝突判定がおかしくなる不具合がありました。これは、レイを進める回数が少なすぎたため、レイがどこにも当たらないまま中途半端な場所で反復処理が終了しているのが原因でした。反復回数を64 → 256に増やしたところ改善しました

今後の開発予定

前回も書いたのですが、レイマーチングじゃなくてVulkanを学習するのが目的なので、レイマーチングはそこそこで終わらせたいです。
とはいえ、現状だとまだまだ中途半端なのでもうちょい作り込みたい欲求もあり…悩ましいですね。

とりあえず、やってみたいことリスト

・オブジェクトスペースでの回転
・反復表示
・反射
・ソフトシャドウ

今週か来週くらいまでやる感じですかねー

いいなと思ったら応援しよう!