gpt4 book ai didi

c++ - 更正高度映射测地球体上的顶点法线

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:05 24 4
gpt4 key购买 nike

已经生成了一个测地线球体,并且正在使用 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;

但是这会产生如下所示的结果:

Weird results

我做错了什么?

谢谢

编辑-已恢复为不进行任何高度映射。这只是将地球投影到测地线球体上,带有高光和法线贴图。你可以看到我在所有三角形上都得到了奇怪的照明,尤其是在光线角度更陡峭的地方(所以瓷砖自然会更暗)。我应该注意我现在根本没有索引三角形,我在某处读到我的切线和副切线应该是所有相似点的平均值,不太了解这会实现什么或如何做到这一点。这是我需要调查的事情吗?对于此示例,我也恢复使用原始法线 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;

立方体只是我的“播放器”,我用它来帮助照明等,以及查看相机的位置。另请注意,完全移除法线贴图并仅使用输入法线可以修复光照。 enter image description here

谢谢你们。

最佳答案

(第二个)问题确实通过索引我所有的点,并对切线和副切线的结果进行平均来解决。这导致了第一个问题的修复,该问题是由不良切线和副切线间接引起的。

关于c++ - 更正高度映射测地球体上的顶点法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57836905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com