最近作っていた GLSL 海シェーダに、静的な環境光の反射だけでなく、海に浮かんでいる物体の反射を表現できる機能を追加しました。
物体の反射表現に関しては、騙し騙しの方法なので、色々と試行錯誤が必要で苦労しました。やったことを書いておきます。
- 海に浮かぶ物体を描画。
- 海に浮かぶ物体をカメラのY座標、エイムのY座標を反転させて、本物を描画したFBOとは別のFBOに描画(元のFBOは後で深度値を利用するので汚さないため)。このとき、Y座標(高さ)に応じてアルファ値を下げておく(水面に映るときに物体との距離が離れるほど淡い反射になるようにするため)。
- 反転させて描画した物体をスクリーン座標系でY軸反転。
- 本物を描画したバッファと同じカラーバッファに海となる平面を描画。このときスクリーン座標系で物体を反転描画したカラーバッファをテクスチャとして、視点から投影マッピングでアルファブレンドではりつける。また、テクスチャをフェッチするときに、頂点シェーダで歪ませた法線を利用してX軸のテクスチャ座標のみ歪ませる(Yを歪ませると本物と物体のYの位置関係がずれて違和感があったため)。