我目前正试图在我的图形引擎上实现SSAO。我遵循约翰查普曼的教程这里。这是一篇非常流行的文章,在许多SSAO文章中用作参考。
让我困惑的部分是旋转矢量的生成。
for (int i = 0; i < noiseSize; ++i) {
noise[i] = vec3(
random(-1.0f, 1.0f),
random(-1.0f, 1.0f),
0.0f
);
noise[i].normalize();
}注意,向量的z分量是零。在这篇文章中,John解释说,他想让样本向量绕z轴旋转。但是后来当他构造TBN矩阵时,他把它当作一个视图空间坐标来使用。
vec3 rvec = texture(uTexRandom, vTexcoord * uNoiseScale).xyz * 2.0 - 1.0;
vec3 tangent = normalize(rvec - normal * dot(rvec, normal));
vec3 bitangent = cross(normal, tangent);
mat3 tbn = mat3(tangent, bitangent, normal);我看不出为什么噪声矢量的z矢量应该是零。我认为零分量可以是任何分量。那么,如果法线向量与噪声向量平行,它不会产生一个错误的TBN矩阵吗?
发布于 2018-09-14 15:11:34
因为您正在处理屏幕空间,视图光线指向眼睛(Z是相机空间深度)。为了建立一个正交基,向量必须是垂直的。为此,您将切线和双角集的坐标z设置为0,这将确保这些矢量存在于垂直于视图射线的平面中。
最后,您需要使切线和双角垂直,这是通过这样完成的。
vec3 tangent = normalize(rvec - normal * dot(rvec, normal));
vec3 bitangent = cross(normal, tangent);https://computergraphics.stackexchange.com/questions/7976
复制相似问题