2011-01-19 3 views
3

Parallaxマッピングで間違った結果が得られます。私は何が間違っているのか分からない。GLSL、Openglでの視差マッピングの問題

alt text

alt text

"影" は間違った場所にあります。

光が観察者から指向し、立方体に向かっています。 (dhpoware.comに基づく) シェーダプログラム:

[vert] 
    varying vec3 lightDir;    
    varying vec3 viewDir; 
    attribute vec4 tangent; 
    void main() 
    { 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    vec3 vertexPos = vec3(gl_ModelViewMatrix * gl_Vertex); 
    vec3 n = normalize(gl_NormalMatrix * gl_Normal); 
    vec3 t = normalize(gl_NormalMatrix * tangent.xyz); 
    vec3 b = cross(n, t) * tangent.w; 
    mat3 tbnMatrix = mat3(t.x, b.x, n.x, 
          t.y, b.y, n.y, 
          t.z, b.z, n.z); 
    lightDir = (gl_LightSource[0].position.xyz - vertexPos)/1000.0; 
    lightDir = tbnMatrix * lightDir; 
    viewDir = -vertexPos; 
    viewDir = tbnMatrix * viewDir; 
    } 

    [frag] 
    varying vec3 lightDir;    
    varying vec3 viewDir; 
    uniform sampler2D diffuseMap; 
    uniform sampler2D normalMap; 
    uniform sampler2D heightMap; 
    uniform float scale; 
    uniform float bias; 
    void main() 
    { 
    vec3 v = normalize(viewDir); 
    vec2 TexCoord = gl_TexCoord[0].st; 
    { 
    float height = texture2D(heightMap, gl_TexCoord[0].st).r; 
    height = height * scale + bias; 
    TexCoord = gl_TexCoord[0].st + (height * v.xy); 
    } 
    vec3 l = lightDir; 
    float atten = max(0.0, 1.0 - dot(l, l)); 
    l = normalize(l); 
    vec3 n = normalize(texture2D(normalMap, TexCoord).rgb * 2.0 - 1.0); 
    vec3 h = normalize(l + v); 
    float nDotL = max(0.0, dot(n, l)); 
    float nDotH = max(0.0, dot(n, h)); 
    float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess); 
    vec4 ambient = gl_FrontLightProduct[0].ambient * atten; 
    vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL * atten; 
    vec4 specular = gl_FrontLightProduct[0].specular * power * atten; 
    vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular;color *= texture2D(diffuseMap,TexCoord); 
    gl_FragColor = color ; 
    } 

ログキューブコンテンツ(接線が第四成分が利き手で、含まれています)から:

------------------------------------------------------------------------------------------------------------------ 
VecContainer<Vertex> vertices = 

size: 36 
space: 36 
{ 
-4.000000, -4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
-4.000000, -4.000000, 4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, -4.000000, 4.000000, 

} 

------------------------------------------------------------------------------------------------------------------ 
VecContainer<Vertex> texcoords = 

size: 36 
space: 36 
{ 
0.000000, 0.000000, 
0.000000, 1.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
1.000000, 0.000000, 
0.000000, 0.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 

} 

------------------------------------------------------------------------------------------------------------------ 
VecContainer<Vertex> normals = 

size: 36 
space: 36 
{ 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 

} 

------------------------------------------------------------------------------------------------------------------ 
VecContainer<tangent>* tangents = 

size: 36 
space: 36 
{ 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000 

} 

------------------------------------------------------------------------------------------------------------------ 
VecContainer<GLuint> indices = 

size: 12 
space: 12 
{ 
3, 4, 5, 
6, 7, 8, 
9, 10, 11, 
12, 13, 14, 
15, 16, 17, 
18, 19, 20, 
21, 22, 23, 
24, 25, 26, 
27, 28, 29, 
30, 31, 32, 
33, 34, 35, 
0, 1, 2 

} 

この問題を引き起こす可能性がありますか?

+0

重複:http://stackoverflow.com/questions/4750707/again-parallax-mapping-issue-in-opengl-glsl-its-not-as-usual-as-it-seem-to-b – GManNickG

+0

第2のイメージの「良い結果」については同意しない。影はまだカメラの方に向いています。あなたはそれが光源だと言いました。 –

+0

コメントありがとうございました。あなたは正しいですが、問題はかなり古いですが、とにかく解決されましたが、私はちょうどSOフォーマットに合わせるための編集をほとんどしませんでした。最初のページにぶつかるのを忘れました。 –

答えて

3

あなたの以前の質問と同じように、私はあなたにはまだ同じ問題があると思います。あなたはどこかでマイナスを忘れるか、間違った順序でクロスプロダクトを実行しました。

+0

合意。影がいくつかの顔や角度からは正しいが他の人からは間違っていれば、あなたの接線のいくつかは間違った利き手になります。 –

関連する問題