GLSL在正常映射后仍然可以看到三角形

时间:2014-06-26 19:49:17

标签: c++ opengl mapping glsl

我假设法线贴图应该消除网格上三角形的可见性,因为照明将基于每个片段的唯一法线而不是每个顶点来计算。正如您在下图中看到的那样,法线贴图确实有效,但三角形仍然可见。这是一个错误吗?

enter image description here

我按如下方式计算切线:

vec3 vert1( vertices[a+1] - vertices[a] );
vec3 vert2( vertices[a+2] - vertices[a] );
vec2 uv1( uvs[a+1] - uvs[a] );
vec2 uv2( uvs[a+2] - uvs[a] );

float r = (uv1.x * uv2.y) - (uv1.y * uv2.x);
vec3 tangent(vert1 * uv2.y - vert2 * uv1.y)*r;

顶点着色器:

mat3 TBN_MATRIX;
TBN_MATRIX[0]   = (MODEL_MATRIX * vec4( tangent,0 )).xyz;
TBN_MATRIX[2]   = (MODEL_MATRIX * vec4( normal,0 )).xyz;
TBN_MATRIX[1]   = cross( TBN_MATRIX[2], TBN_MATRIX[0] );

Fragment Shader:

fragment_normal = normalize( TBN_MATRIX * vec3(( 2 * texture( normal_map, uv_coordinates ).rgb ) - 1.0 ) );

我的第一个想法是,交叉产品在某种程度上不足以让它变得愚蠢吗?

0 个答案:

没有答案