2009-04-29 10 views
3

私はFBOとGLSLでシャドウマップを実装しています。 高さフィールドで使用されます。それはいくつかのオブジェクト(木、植物、...)が高さの欄に影を投げかけます。OpenGL:ShadowMapping:影がy = 0にしか表示されない

私が持っている問題は、影がハイフィールドの地面にしか見えないということです。つまり、高さフィールドの高さ= 0です。高さがあるとすぐに、影が消えます。シャドーマップそのものを見ると、すべてがうまく見えます...ライトに近いオブジェクトは暗くなります。

は、ここに私のGLSLのvertexshaderです:

uniform mat4 lightView, lightProjection; 

const mat4 biasMatrix = mat4( 0.5, 0.0, 0.0, 0.0, 
          0.0, 0.5, 0.0, 0.0, 
          0.0, 0.0, 0.5, 0.0, 
          0.5, 0.5, 0.5, 1.0);  //bias from [-1, 1] to [0, 1] 

void main() 
{ 
gl_Position = ftransform(); 

mat4 shadowMatrix = biasMatrix * lightProjection * lightView; 
shadowTexCoord = shadowMatrix * gl_Vertex;  
} 

fragmentshader:

uniform sampler2DShadow shadowmap; 
varying vec4 shadowTexCoord; 

void main() 
{  
vec4 shadow = shadow2DProj(shadowmap, shadowTexCoord, 0.0); 
float colorshadow = shadow.r < 0.1 ? 0.5 : 1.0; 

vec4 color = vec4(1,1,1,1); 

gl_FragColor = vec4(color*colorshadow, color.w); 

}

おかげで、この上の任意の助けのためにたくさん!

答えて

0

あなたはコピー貼り付けを忘れていたかもしれませんが、shadowTexCoordが頂点シェーダの中で変化するとは思われません。しかし、コンパイルエラーになるはずです。

+0

これは実際にはより多くのコメントであり、答えではありません – IanNorton

2

ここでは、異なるスペース間に混乱が生じるかもしれないと思います。書かれているように、あなたのコードは、地面のgl_ModelViewMatrixにカメラ変換だけが含まれている場合にのみ機能します。 ftransformは基本的にgl_Vertexがオブジェクト座標で指定されていることを意味

gl_Position = gl_ProjectionMatrix * (gl_ModelViewMatrix * gl_Vertex) 

を行くためです。しかし、典型的にはライトのビューマトリックスはワールド座標からライトのビュースペースにマップするので、このコードはオブジェクトスペース=ワールドスペースの場合にのみ機能します。基本的には、地形を拡大縮小し、オブジェクト空間が世界空間と同じではないと言うことができます。カメラのビュー行列とモデリング変換 - 私はこのコードをテストしたhaventは(例えばオブジェクト>ワールド空間)

を、私はこのような何かをしようとするだろう:このため、次の2つの部分にgl_ModelViewMatrixを分離する必要が

uniform mat4 lightView, lightProjection; 
uniform mat4 camView, camProj, modelTrans; 
const mat4 biasMatrix = mat4( 0.5, 0.0, 0.0, 0.0, 
                 0.0, 0.5, 0.0, 0.0, 
                 0.0, 0.0, 0.5, 0.0, 
                 0.5, 0.5, 0.5, 1.0);  //bias from [-1, 1] to [0, 1] 

void main() 
{ 
mat4 modelViewProjMatrix = camProj * camView * modelTrans; 
gl_Position = modelViewProjMatrix * gl_Vertex; 

mat4 shadowMatrix = biasMatrix * lightProjection * lightView * modelTrans; 
shadowTexCoord = shadowMatrix * gl_Vertex;  
} 

技術的には、CPU上の行列を掛けるほうが速く、必要なものだけを渡すほうが速いですが、ときどき処理する方が簡単です。

+0

ユニフォームでシェーダに渡すのではなく、gl_MovelViewMatrixを使用できませんでしたか? – clamp

+1

はい、gl_ModelViewMatrixには、オブジェクトとビューの両方の変換が組み合わされています。これは、レンダリングのために頂点を変換する必要がありますが、影を行うには別の "オブジェクト変換のみ"の行列を渡す必要があります。個人的には、ハードウェア的には同じもので、組み込み関数はGL3で廃止されているので、組み込み関数と "カスタム"の区別をするのが悪い形だと思うので、すべてを統一として渡します。それはスペースのものとタブの種類のようなものですが、自由に何でもできます。 – Lucas

+0

よろしくお願いいたします。 btw:クライアント側のmodelTransはどうやって取得できますか?すべてのglRotates、glScalesなどを手動で乗算して、それをシェーダーに「modelTrans」として入れた行列にする必要がありますか? – clamp

関連する問題