내 시차 매핑이 잘못된 결과를 제공합니다. 나는 무엇이 잘못 될 수 있는지 모른다. GLSL, Opengl의 시차 매핑 문제
은 "그림자"
가 잘못된 위치에 있습니다.빛이 관찰자로부터 나와 큐브쪽으로 간다. (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 ;
}
로그 (접선은 네 번째 구성 요소가 사용하는 손 포함)?
중복 : http://stackoverflow.com/questions/4750707/again-parallax-mapping-issue-in-opengl-glsl-its-not-as-usual-as-it-seem-to-b – GManNickG
두 번째 이미지에서 "좋은 결과"에 대해서는 의견이 다릅니다. 그림자는 여전히 카메라쪽으로 향하고 있습니다. 당신은 광원이라고 말했습니다. –
Ben에게 감사의 말씀을 전합니다. 문제가 상당히 오래되어 해결되었지만 SO 형식을 더 잘 맞출 수있는 편집을 거의하지 못했습니다. 첫 페이지에서 부딪 힐 것을 잊었습니다. –