已经生成了测地线球,并且正在使用perlin噪声生成山丘等。将研究使用tessalation着色器进行进一步划分。但是,我使用的是法线贴图,为此,我在以下代码中生成切线和切线:
//Calulate the tangents
deltaPos1 = v1 - v0;
deltaPos2 = v2 - v0;
deltaUV1 = t1 - t0;
deltaUV2 = t2 - t0;
float r = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
tangent = (deltaPos1 * deltaUV2.y - deltaPos2 * deltaUV1.y) * r;
bitangent = (deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x) * r;
在我使用高度贴图之前,球体上的法线很简单。
normal = normalize(point-origin);
但是,一旦涉及到高度图,显然这是非常不同的。我目前正在着色器中切线和切线,以找出法线,但这会产生一些奇怪的结果
mat3 normalMat = transpose(inverse(mat3(transform)));
//vec3 T = normalize(vec3(transform*tangent));
vec3 T = normalize(vec3(normalMat * tangent.xyz));
vec3 B = normalize(vec3(normalMat * bitangent.xyz));
vec3 N = normalize(cross(T, B));
//old normal line here
//vec3 N = normalize(vec3(normalMat * vec4(normal, 0.0).xyz));
TBN = mat3(T, B, N);
outputVertex.TBN = TBN;
但是这会产生如下结果:
我做错了什么?
谢谢
编辑-
已恢复为不执行任何高度映射。这只是将地球投影到具有镜面反射和法线贴图的测地线范围内。您可以看到我在所有三角形上都得到奇怪的照明,尤其是在光线角度更陡峭的地方(因此瓷砖自然会更暗)。我应该注意,我现在根本没有索引三角形,我读过某个地方,我的切线和切线应该是所有相似点的平均值,而不是很清楚这将实现什么或如何实现。那是我需要研究的东西吗?
在此示例中,我还恢复了使用原始法线normalize(point-origin)
的功能,这意味着我的TBN矩阵计算看起来像
mat3 normalMat = transpose(inverse(mat3(transform)));
vec3 T = normalize(vec3(transform * tangent));
vec3 B = normalize(vec3(transform * bitangent));
vec3 N = normalize(vec3(normalMat * vec4(normal, 0.0).xyz));
TBN = mat3(T, B, N);
outputVertex.TBN = TBN;
魔方只是我的“玩家”,我只是用它来帮助照明等,并查看相机的位置。另请注意,完全删除法线贴图并仅使用输入法线即可固定照明。
谢谢大家。
答案 0 :(得分:1)
(第二个)问题确实通过索引我的所有点并平均切线和双切线的结果而得以解决。这导致了第一个问题的解决,该问题间接由不良切线和双切线引起。