VRエンジン作成日記

ひたすらVRエンジンを作っていきます

ライティングの調整

ライティングの処理を調整した。今までは平行光源だけを実装していたけど、点光源とスポットライトを追加した。スポットライトは今のところフラグメントシェーダで処理した方がいいところを頂点シェーダで処理してしまっているので、表示に不自然さが残っている。また、ライトを4つまで同時に追加できるようにした。GLSL内のfor文でループできるのかと思いきや、WebGL1で書いているからかハードウェアの影響かはよく分かっていないけど、for文の繰り返し回数が変数だとエラーが出て処理できなくなってしまう。例えば次のような文はエラーになる

// エラーになる for 文

for (int i = 0; i < length; i++) {

}

エラーにならないようにするためには定数で書く必要があった。

// エラーにならない for 文

for (int i = 0; i < 4; i++) {

}

for文の制限については理解できたものの、今度は配列のインデックス指定でも同様の制限があり、array[i] と書くとエラーになる。今のところ簡単な解決策が分からなかったので、ライトの個数分だけループを展開して書くことにした。ソースコードが膨れ上がってくるのと、同じことを何か所にも書いているのでメンテナンス性も良くない。

GLSLのvarying句の使い方がきちんと理解できてきた。頂点シェーダでvarying変数に入れた値は、頂点が3つ揃った段階で面の部分のピクセル1つ分ごとに3点間で補間されて、その値がフラグメントシェーダに渡されるようだ。WebGL2では補間方法を選べるようだけど、WebGL1では補間方法が1種類で、滑らかな補間しかできないようになっているらしい。

・関連するコミット

add point light and spot light · hikipuro/tea.js@575af61 · GitHub