2011年01月26日

スポットライトのテスト

光の散乱のところのサンプルでは、GLSLのコードと実行プログラムしかありませんでしたので、uniformでOpenGLのプログラムから渡している部分については自分で作成する必要がありました。

アフィン変換や逆行列の復習をしていたのは、スポットライトのシェーダプログラム内でg_worldToLightと、g_lightToWorldという2つの4x4の行列を使用していたからだったりします。

g_worldToLightという行列は、ワールド座標系を光源から見た座標系に変換する行列だと思われます。ワールド座標を視点から見た座標系に変換するビューイング変換では、z軸がターゲットへのベクトルとなっていますが、このプログラムではy軸がターゲットへのベクトルとなっているようです。(vec3 lightDir = g_lightToWorld[1].xyz;)(2011/2/1修正)

この行列の作り方は下記のサイトが参考になります。
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090902

g_lightToWorldは、その逆行列ですので、前回の随伴法で計算しました。
後は光の散乱のサンプルのSpotLight.glslを一部修正してノイズ関数を追加してみました。

実行結果

一応今回も画像と動画を載せておきます。
スポットライト以外の光源を計算していないので、スポットライトが当たっていないところは真っ暗です。

glsl_spotlight_001.png


一応できましたが理解せずに使用しているだけですので、どういうやり方をしているのかも見ていきたいと思います。

web拍手 by FC2
posted by シンドラー at 15:03 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年01月25日

逆行列の求め方について

前回は移動回転のみの行列の逆行列の求め方だけを書きましたので、それ以外の場合についても書いておこうと思います。

ガウスの掃き出し法は大きい行列の時はいいのですが、小さい行列の時は古典的な随伴法の方が速いらしいです[1]。

古典的な随伴法というのは良く分かりませんが、余因子行列の転置が随伴行列で、それを行列式で割ったものが逆行列だそうです。

1. (x,y,z,w)でwの項が変化しない場合
前回+スケーリングやせん断で、3x3の回転成分が直交行列とは限らない場合です。
この場合は、前回と同じように回転成分と平行移動成分に分けて、回転成分の部分を転置ではなく3x3の行列として随伴法で計算すればいいです。
これは参考文献[1]のサンプルプログラムにあるので省略します。

2. wの項が変化する場合
透視投影行列などは、wの項も使用しているため、回転成分と平行移動成分に分けて計算といったことができません。
inverse_002.png
この行列の求め方は参考文献[2]に載っています。

このような行列は随伴法で計算するしかないのではないかと思います。
逆行列を求める必要があるのかどうかも良く分かりませんが。

4x4の随伴法で計算すれば、行列式が0でない行列であればおそらく逆行列を計算できますが、計算時間的には前回の手法<1.の手法<2.の手法だと思いますので、どういう行列かあらかじめ分かっている場合には使い分けた方がいいかもしれません。
(ModelView行列などは直交かどうか判定して前回の手法を使うよりは1.の手法を使った方がいい気がします)

[1] Fletcher Dunn, Ian Parberry著, 松田 晃一訳:「実例で学ぶゲーム3D数学」, O'REILLY
[2] http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090829
続きを読む
web拍手 by FC2
posted by シンドラー at 16:45 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年01月23日

アフィン行列の復習

冬休みに行ったOpenGLの復習のまとめです。

ちゃんと勉強したい場合は床井先生のゼミを第1回からやっていくといいと思います。
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090821

レンダリングの流れは下記の様な感じです。

affine_000.PNG

gluLookAtとかglTranslateとかgluPerspectiveなどの関数は、何か特別な処理をしているわけではなく、引数を元に4x4のアフィン行列を生成し、元の行列にかけているはずですので、自分でそれらの関数を実装することはできます。

affine_001.PNG

affine_002.PNG

上の例は平行移動とスケールですが、ビューイング変換は視点から見た座標系に変換できる行列を作って掛けますし、正規化変換では正規化座標系に収まるようなアフィン行列を計算します。

このアフィン行列は、行列を掛ける順番で結果が変わってしまうので、注意が必要です。
(移動してから回転する場合と、回転してから移動する場合では結果が異なります)

affine_003.PNG

変換を行った後に、元の座標を知りたい場合などには、逆行列を掛けることで逆変換することができます。方法としては、4x4の逆行列を計算すればいいのですが、平行移動と回転のみを行うアフィン変換の行列では、簡単に逆行列を計算することができます。

affine_004.PNG
affine_005.PNG

affine_006.PNG

下記参考ページを元に、今回の話を追加したソースを置いておきます。AffineTest.zip
http://d.hatena.ne.jp/ousttrue/20081109/1226219350

モデルビュー変換のところは逆行列が計算できていますが、射影変換行列はスケール変換などを含むため、逆行列が求められていないことがわかります。(モデルビュー変換でもスケール変換などを追加すれば求まりません)

この場合は普通に4x4の逆行列を計算するしかないのではないかと思います。
(計算時間が少なくなるいい方法があるようでしたら教えてください)

GLSLを使用する場合は、gl_ModelViewProjectionMatrixInverseといった行列が用意されているのですが、この辺りはあまり使ったことがないのでGLSL1.3以降等でちゃんと使えるのかどうかはわかりません。

多分あっていると思いますが、間違っている部分などありましたら修正しますので教えてください。

web拍手 by FC2
posted by シンドラー at 20:27 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年01月13日

GLSLのnoise関数について

GLSLにnoise関数がありますが、実装されていないみたいですね。

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=226934

自分でnoise関数を実装されている方がいらっしゃいましたので、そのまま使用させていただくことにしました。

実行結果

キャプチャソフトを変更しました。ロゴが入っていますが気にしないでください。FPSも出るので便利です。
なぜかDOWNLOADしないと動画が再生されないようですので画像を張っておきます。

glsl_noise_002.png glsl_noise_001.png


前回のコードでnoiseを3d textureとして使用している部分がコメントアウトになっていたので、空気中の埃みたいなものを表現できるのかなと思っていたのですが、水中から見た水面のような効果になっていますね。ノイズの種類や使い方にもよるのかもしれませんが。

えー要望があったのでこのプログラムのソースを置いておきます。
GLSL_GPU_noise.zip

2つの参考サイトのシェーダプログラムを無理矢理1つのファイルに詰め込んでいるだけなので非常に読みにくいと思います。
正直使っているだけで中身はよく理解できていません。
たまたまPerlin noiseが水面のように見えただけだと思いますが、リアルタイムでノイズをのせられるのはありがたいことです。
web拍手 by FC2
posted by シンドラー at 17:13 | Comment(3) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年01月05日

光の散乱について

ボリュームライトのようなものを試してみたくなりました。

参考サイト:https://mmack.wordpress.com/2010/05/29/in-scattering-demo/

考え方としてはレイマーチング法のようなものなのでしょうか。
式の導出とデモ(GLSLのコード)もあって参考になります。
ですが今回はGLSLのコードをほぼそのまま使わせていただいているだけです。

ポイントライトの方は動いたようなので、スポットライトの方も試してみる予定です。

実行結果

動画にしたらモアレがひどかったので画像です。

glsl_light_001.png glsl_light_002.png
web拍手 by FC2
posted by シンドラー at 19:17 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする