原始人のプログラミング日記

println(++C++); // println(C++), ++C;

光と闇が両方そなわり最強に見える

いい感じにできた


f:id:kawazuini:20170921210332p:plain
複数光源のシャドウマッピング

虚像っぽいの

シャドウマッピングにおいて光源視点で全てのポリゴンを視野に収めていない場合、光源方向のちょうど反対側に虚像?(逆さ影)みたいのができてしまう。

曰く、デプスバッファとの比較時に負のデプス値(光源後ろ側)は無限遠の値を取るらしい。
これによって、光源視野外の後ろ側にも影ができてしまう。

推測ではシェーダでさらに判定をかませば解決できそうだけど、めんどくさいので光源のスポットカットでごまかした*1

glslでのテクスチャ系の配列

built-in array must be redeclared with a size before being indexed with a variable
組み込み配列は、変数でインデックスを付ける前にサイズを再宣言する必要があります

配列に変数の添え字を使おうとしたら出たエラー、再宣言の仕方分からなくて適当にfor分を平文に展開した。

シャドウマッピングをすべての光源に対して行おうとした場合に自分の環境だと、光源数が8個に加えてオブジェクトに適用するテクスチャがあるので、テクスチャが合計9枚必要になる。
なので、gl_TexCoord[8]でテクスチャ座標にアクセスしようとしたらアウトオブレンジではじかれた。
これも再宣言すれば解決するのかもしれないけど、めんどくさいので自分で変数を用意してごまかした。

9/22追記>

各シェーダの先頭(他の変数と同様)に

varying vec4 gl_TexCoord[gl_MaxTextureCoords];

を書けばコンパイルが通った。
けど、結局配列の数は固定っぽい?(変えるとエラーになった)

<追記終わり

作った感想

想像の10倍以上時間かかってめんどくさかった


影を作るということで描画の回数が増えたんだけど、そこらへんの柔軟性は考えてなかったのでメインループ一回壊してから再構成した。マルチテクスチャということでシェーダも同じ感じのことした。

glslの書籍とか持ってないのでネットをさまよったけど、自分の欲しい情報が見つからなくて困った。
glslは本買って体系的に理解した方がいいのかもしれない。

ちなみに、とあるOpenGL系のサイトの逆行列の計算式まちがってるので気を付けよう(3時間もっていかれた)。

ソースコードはいまからリファクタリングして上げるかもしれないし上げないかもしれない。

*1:いい方法あったら教えてください