私はOpenGLを使用してゲームを作成しており、シャドウボリュームを実装しようとしています。
頂点シェーダーを介してGPU上にモデルのシャドウボリュームを構築したいと思います。そのために、モデルをVBOで表します。
- 各三角形が独自の3つの頂点を持つように、頂点が複製されます。
- 各頂点には、その三角形の法線があります
- 入らない理由で、とにかく上記の2つのポイントを実際にやっていたので、頂点の重複についてはあまり心配していません。
- 縮退した三角形が追加され、「通常の」三角形の各ペア間のエッジの内側に四角形が形成されます。
このモデル形式を使用して、頂点シェーダー内で、ライトの反対側を向いている三角形の一部である頂点を見つけ、それらを後ろに移動してシャドウボリュームを形成することができます。
私が理解するために残したのは、後ろ向きの頂点に正確にどのような変換を適用する必要があるかです。
頂点がライトの反対側を向いていることを検出することはできますが、どの変換を適用する必要があるのかわかりません。これは私の頂点シェーダーがこれまでのように見えるものです:
uniform vec3 lightDir; // Parallel light.
// On the CPU this is represented in world
// space. After setting the camera with
// gluLookAt, the light vector is multiplied by
// the inverse of the modelview matrix to get
// it into eye space (I think that's what I'm
// working in :P ) before getting passed to
// this shader.
void main()
{
vec3 eyeNormal = normalize(gl_NormalMatrix * gl_Normal);
vec3 realLightDir = normalize(lightDir);
float dotprod = dot(eyeNormal, realLightDir);
if (dotprod <= 0.0)
{
// Facing away from the light
// Need to translate the vertex along the light vector to
// stretch the model into a shadow volume
//---------------------------------//
// This is where I'm getting stuck //
//---------------------------------//
// All I know is that I'll probably turn realLightDir into a
// vec4
gl_Position = ???;
}
else
{
gl_Position = ftransform();
}
}
単純にに設定gl_position
してみましftransform() - (vec4(realLightDir, 1.0) * someConstant)
たが、これにより、ある種の深度テストのバグが発生し(ボリュームをカラーでレンダリングすると、一部の面が他の面の後ろに見えるように見えました)someConstant
、背面がどこまで伸びるかには影響しなかったようです。 。
更新-1月22日
私がおそらくどのスペースにいるかについての質問を明確にしたかっただけです。私がどのスペースにいるかを追跡することは、私のシェーダーの頭痛の最大の原因であると言わなければなりません。
シーンをレンダリングするとき、私は最初にを使用してカメラをセットアップしましたgluLookAt
。カメラは固定されている場合もあれば、動き回っている場合もあります。それは問題ではないはずです。glTranslated
次に、モデルを配置するなどの変換関数を使用します。
プログラム(つまりCPU上)では、世界空間(3つのフロート)で光ベクトルを表します。開発中に、この光ベクトルをシェーダーの適切なスペースに配置するには、カメラを設定した後、モデルを配置する前に、モデルビューマトリックスの逆数を掛ける必要があることがわかりました。したがって、私のプログラムコードは次のようになります。
- ポジショニングカメラ(
gluLookAt
) - ワールド空間にある光ベクトルを取得し、それを現在のモデルビューマトリックスの逆行列で乗算して、シェーダーに渡します。
- 位置モデルへの変換
- モデルの描画
これは何かを明確にしますか?