首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSAO随机噪声矢量生成

SSAO随机噪声矢量生成
EN

Computer Graphics用户
提问于 2018-08-27 14:22:43
回答 1查看 296关注 0票数 0

我目前正试图在我的图形引擎上实现SSAO。我遵循约翰查普曼的教程这里。这是一篇非常流行的文章,在许多SSAO文章中用作参考。

让我困惑的部分是旋转矢量的生成。

代码语言:javascript
复制
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矩阵时,他把它当作一个视图空间坐标来使用。

代码语言:javascript
复制
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矩阵吗?

EN

回答 1

Computer Graphics用户

发布于 2018-09-14 15:11:34

因为您正在处理屏幕空间,视图光线指向眼睛(Z是相机空间深度)。为了建立一个正交基,向量必须是垂直的。为此,您将切线和双角集的坐标z设置为0,这将确保这些矢量存在于垂直于视图射线的平面中。

最后,您需要使切线和双角垂直,这是通过这样完成的。

代码语言:javascript
复制
vec3 tangent = normalize(rvec - normal * dot(rvec, normal));
vec3 bitangent = cross(normal, tangent);
票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/7976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档