2017-05-15 6 views
-2

OpenGLの視差補正されたローカルキューブマップを暫定的に修正しようとしていますが、実際にどこにでも入ることはできませんでした。視差を補正したOpenGLのキューブマップ?

は、ここに私の現在のシェーダコードです:

フラグメント:

#version 330 
in vec2 TexCoord; 
in vec3 Normal; 
in vec3 Position; 
in vec3 Color; 
out vec4 color; 

uniform samplerCube CubeMap; 
uniform vec3 CameraPosition; 



void main() { 
    vec4 OutColor = vec4(Color,1.0); 

    vec3 normal = normalize(Normal); 
    vec3 view = normalize(Position-CameraPosition); 
    vec3 ReflectionVector = reflect(view,normal); 
    vec4 ReflectionColor = texture(CubeMap,ReflectionVector); 

    OutColor = mix(OutColor,ReflectionColor,0.5); 
    color = OutColor; 

} 

頂点:

#version 330 

layout (location = 0) in vec3 position; 
layout (location = 2) in vec3 normal; 
layout (location = 1) in vec2 texCoord; 
layout (location = 3) in vec3 color; 

out vec2 TexCoord; 
out vec3 Normal; 
out vec3 Position; 
out vec3 Color; 
uniform mat4 ModelMatrix; 
uniform mat4 ViewMatrix; 
uniform mat4 ProjectionMatrix; 
void main() 
{ 
    gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(position, 1.0f); 
    TexCoord=texCoord; 
    Normal = normal; 
    Position = vec4(ModelMatrix * vec4(position,1.0)).xyz; 
    Color = color; 
} 

答えて

2
Position = vec4(ModelMatrix * vec4(position,1.0)).xyz; 

これはワールド空間にPosition出力変数を置きます。そして、ワールド空間でもCameraPosition均一にされると仮定:

vec3 view = normalize(Position-CameraPosition); 

viewもワールド空間になります。

ただし、Normalは、頂点属性から直接得られます。したがって、オブジェクトを回転するたびに各頂点のNormalの値を更新しない限り、その値はおそらくモデル空間内にあります。したがって:

vec3 ReflectionVector = reflect(view,normal); 

この文は、支離滅裂です。 viewは1つのスペースにあり、normalは別のスペースにあります。そして、異なる座標系にあるベクトルに対しては、本当に合理的な操作を実行することはできません。

Normal,Position、およびCameraPositionがすべて同じスペースにあることを確認する必要があります。その空間をワールド空間にするには、Normalをワールド空間に変換する必要があります。これは、一般的には、あなたのモデル - ワールドマトリックスの逆/転置を計算する必要があります。