2011-01-19 2 views
3

내 시차 매핑이 잘못된 결과를 제공합니다. 나는 무엇이 잘못 될 수 있는지 모른다. GLSL, Opengl의 시차 매핑 문제

alt text

alt text

은 "그림자"

가 잘못된 위치에 있습니다.

빛이 관찰자로부터 나와 큐브쪽으로 간다. (dhpoware.com 기준) 쉐이더 프로그램 :

------------------------------------------------------------------------------------------------------------------ 
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 

} 

어떤이 문제가 발생할 수 : 큐브의 콘텐츠에서

[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 ; 
    } 

로그 (접선은 네 번째 구성 요소가 사용하는 손 포함)?

+0

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

+0

두 번째 이미지에서 "좋은 결과"에 대해서는 의견이 다릅니다. 그림자는 여전히 카메라쪽으로 향하고 있습니다. 당신은 광원이라고 말했습니다. –

+0

Ben에게 감사의 말씀을 전합니다. 문제가 상당히 오래되어 해결되었지만 SO 형식을 더 잘 맞출 수있는 편집을 거의하지 못했습니다. 첫 페이지에서 부딪 힐 것을 잊었습니다. –

답변

3

이전 질문에서와 같이 여전히 동일한 문제가 있다고 생각합니다. 어딘가에서 마이너스를 잊어 버렸거나 다른 제품을 잘못된 순서로 수행했습니다.

+0

동의. 그림자가 일부면이나 일부 각도에서는 올바르지 만 다른면에서는 잘못된 경우에는 일부 접선이 잘못된 손잡이를가집니다. –