2012-02-08 30 views
0

OpenGL ES 2.0で動作するキューブマップを使用してリフレクションマッピングを取得しようとしています。フラグメントシェーダのsamplerCubeに正しく反映されるように反射方向を計算しているかどうかはわかりません。GLSLでのリフレクションマッピング

まず、Projection、Model、View MatrixとModelViewマトリックスを組み合わせたものを用意しました。ここではGLSLの私の頂点シェーダのコードは次のとおりです。

attribute vec4 Position; 
attribute vec3 Normal; 

uniform mat4 Projection; 
uniform mat4 ModelView; 
uniform mat3 Model; 
uniform mat4 ModelViewProjectionMatrix; 
uniform vec3 EyePosition; 

varying vec3 ReflectDir; 


void main() 
{ 
    gl_Position = Projection * ModelView * Position; 
    mediump vec3 EyeDir = normalize(Position.xyz - EyePosition); 

    // Reflect eye direction by normal, and transform to world space 
    ReflectDir = Model * reflect(EyeDir, Normal); 
} 

私の仮定はEyeDirectionは、オブジェクト空間内にある必要があります。 (正解?) オブジェクト空間でEyePositionを取得するにはどうすればよいですか?逆ModelView行列でカメラの位置を(つまり常にOpenGLの{0,0,0}に)変換するだけですか?

私はこれを試しましたが、ReflectDirが間違っているかのように、私のフラグメントシェーダがすべて黒に塗りつぶしています。

XcodeでOpenGL ES 2.0リフレクションマッピング(samplerCubeを使用)の実例がありますか?

+0

「モデル」とは何ですか?そして、あなたがこれをするときに起こっていることは間違っていますか? –

+0

モデルは、オブジェクト空間座標をワールド空間座標に変換する変換行列です。オブジェクトがレンダリングされると、完全に黒ですが、フラグメントシェーダのReflectDirを使用してsamplerCubeから色をサンプリングすることになっています。だから、ReflectDirを計算する方法に何か問題があると思う。 – user1081465

答えて

5

ワールド座標では、目の向きと法線の両方を取得するのが通常の方法です。次に、ルックアップベクトルは、

として計算されます。

vec3 lookup = normalize(reflect(EyeDir, Normal));