簡體   English   中英

在GLSL,Opengl中的視差映射問題

[英]Parallax mapping issue in GLSL, Opengl

我的視差貼圖給出了錯誤的結果。 我不知道什么是錯的。

替代文字

替代文字

“影子”在錯誤的地方。

光從觀察者指向並朝向立方體。 着色器程序(基於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 

}

什么可能導致這個問題?

與上一個問題一樣,我認為您仍有同樣的問題。 你在某個地方忘記了減號,或者可能以錯誤的順序執行了交叉產品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM