SSAO着色器切线计算的坐标系统与零向量问题咨询
SSAO着色器Gram-Schmidt切线计算的疑问解答
疑问一:不同坐标系下的投影是否无意义?
你搞错了随机向量的坐标系——教程里生成的z=0随机向量不是切线空间的向量,而是视图空间xy平面内的向量。
我们要构建的切线空间,是以当前片段的视图空间法线为z轴的局部坐标系。为了得到这个空间的切线基向量,需要一个和法线垂直的初始方向。把随机向量的z设为0,就是让它落在视图空间的xy平面,这样整个Gram-Schmidt过程都在视图空间内完成:用法线投影随机向量,得到法线方向的分量,再从原向量中减去这个分量,就能得到和法线垂直的切线向量。坐标系是统一的,所以投影操作完全有效。
教程里说“采样核在切线空间沿z轴正方向”,指的是最终采样核会被变换到我们刚构建的切线空间(以法线为z轴),而z=0的随机向量是用来提供随机切线方向,避免SSAO出现规律条纹。
疑问二:randomVec会不会和normal完全相同导致零向量?
绝对不会,理由如下:
- 生成的randomVec是z分量固定为0的单位向量,而视图空间的法线normal必然有非零z分量(视图空间中,法线指向相机,z轴对应深度方向)。两者方向不可能重合,一个在xy平面,一个有z轴分量。
- 就算是极端情况:比如normal是(0,0,1)(完全垂直于相机的平面),此时randomVec是xy平面的单位向量,
dot(randomVec, normal)结果为0,计算出的切线就是normalize(randomVec),完全有效。
所以randomVec - normal * dot(randomVec, normal)永远不会是零向量,归一化操作是安全的。
内容的提问来源于stack exchange,提问作者TwoheadedFetus
相关产品推荐
相关产品推荐

