レイトレ合宿7に行ってきました
こんにちはtatsyです。最近、全くブログの方を更新していなかったのですが、今週末は猪苗代湖で行われたレイトレ合宿7に行ってきました。
私が言うのもおこがましいのですが、近年は参加者のインフレが続いておりまして、上記のWebページに公開されている画像も非常にハイレベルです。何よりの驚きは、これほどレベルが上っているのに、年々、レンダリングにかけられる時間は減っているということです (今年は1分間)。
本当に毎年ハイクオリティなレンダラを提出されている参加者の皆さんには尊敬の念しかありません!
提出したレンダラについて
肝心の私のレンダラですが、今年はGPUを使おうということは当初から決めていて4月くらいにOptiXのテストだけは軽くしてありました。ただ、そこからほとんど何もしていなかったのと、OptiXだとNVIDIAのGPUが載っているマシンでしか開発ができず、開発期間がかなり限られそうだったことがあり、OpenGL/GLSLの組み合わせで実装をすることにしました。
この組み合わせはいつかやってみたいと思っていたのですが、2つの点で苦労しました。
1つ目の問題は、最初にsmallptを移植したところ、CPU実装と異なる画像が出たことから始まります。これはGLSLで使用できるfloatの精度の問題だそうで、手元のMacでglGetShaderPrecisionFormat関数を使って精度を調べてみるとfloatに24bitしか使っていないことが分かりました。そのせいでゼロ割りなどを防ぐためにepsilonの値をうまく設定しないと、レンダリング結果に線のようなものが入ったりする問題が起こりました。
一応、OpenGL 4.0からはextensionでdoubleを使えるようなのですが、手元の環境で試すと、floatと挙動が変わってしまって結果が変わってしまい、正しい結果は得られませんでした。
2つ目の問題は上記の挙動にも関係するのですが、GLSLは本当にOSやGPUによって挙動が揃っておらず、環境を変えるごとに、うまくレンダリング結果がでるようにGLSLのコードをデバッグして、どこがおかしいかを探す作業が発生しました。結局、どう書けば、どんな環境でも動く、という悟りを開くには至っていないのですが、一応、それなりの環境では動くようなものにはなりました。
これで無事締め切りまでに投稿したのですが、なんと私のレンダラからは画像が出力されず…涙
これはおそらく今回の実装はオフスクリーンでレンダリングする形式ではなく、直接レンダバッファ上でレンダリングをしており、さらに出力画像のサイズを3Kにしたためだと思っています。
もし実行環境のウインドウが3Kより小さいと、カメラ座標変換の行列が変わってしまって、レイが正しい方向に飛ばなかったのだと思います。ただ、自分がいくつかの環境で試した中でも、特定のGPUでだけ画像がでないことはあったので、もしかするとハードウェア依存の問題なのかもしれません…。
本当にGLSLの挙動の違いに悩まされた開発になりましたが、GLSLでのレイトレはいつかはやってみたいと思っていたので、この機会にそれができてよかったです。
プログラムは私のGitHubで公開しています。
https://github.com/tatsy/opengl-raytracer
(まだ汎用的に使える代物ではない…)
その後…
合宿後に少しプログラムを直してiMac + Radeon Pro 580で一晩レンダリングした画像がこちらになります。
今回はかなり苦労はしたのですが、OpenGLのマルチプラットフォーム性にはかなり魅力を感じていて、事情が許すなら、GLSLで来年も参戦したいなと思っています。
ただOpenGLをフロントエンドにすると、GPUを複数にしたりするのに一工夫必要な気がするので、シェーダ以外の部分はVulkanにして、真にウィンドウレスなプログラムにするのも悪くはないかなと思っています。
毎年のことながらレイトレ合宿は、とても勉強になり、また刺激をもらえる環境で、毎年開催をしていただいているqさん、holeさんにはとても感謝しております。また、来年も参加できるのを楽しみにしています。
最後に合宿のひとコマです。こちらはShockerさんが3Dプリントサービスで作ったStanford bunnyのフィギュア?をみんなで撮影している様子です。
こちらは合宿後に行った五色沼の写真です。こちらはるり沼という沼で、この沼は大きくはないのですが一番きれいでした。
それでは今回もこのあたりで失礼します。もう少しブログも更新できたらなと、思っているのですが、どうなることやら…。
最後までお読みいただき、ありがとうございました。