pissang/clay-viewer

SSAO的半球采样方法

shawn0326 opened this issue · 3 comments

var phi = halton(i + offset, 2) * (hemisphere ? 1 : 2) * Math.PI;

这里phi代表的是方位角吧,如果半球采样的话,theta 最大是 Math.PI,phi最大应该始终是2 * Math.PI。
另外,参考babylon的实现,建议处理一下theta角,避免因过于接近水平面而出现z-fight

这里phi代表的是方位角吧,如果半球采样的话,theta 最大是 Math.PI,phi最大应该始终是2 * Math.PI。

这个半球是在 z 轴方向上的

这个半球是在 z 轴方向上的

抱歉,刚刚也发现了这个问题,重新整理了下写法:

  1. 整理了xyz的上传方式,明确是在tbn空间下的xyz坐标,感觉更好理解一些。这两种写法的xyz在值域上是一样的。
  2. 引入了Babylon对theta角的优化(不过目前还没有证明该优化有效的例子)
var phi = halton(i + offset, 2) * Math.PI * 2;

// rejecting samples that are close to tangent plane to avoid z-fighting artifacts
var cosTheta = 1.0 - (halton(i + offset, 3) * 0.85 + 0.15);
var sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);

var r = Math.random();
// for tbn space
var x = Math.cos(phi) * sinTheta * r;
var y = Math.sin(phi) * sinTheta * r;
var z = cosTheta * r;

@shawn0326 嗯一时想象不到这个效果怎么样,现在 clay-viewer 里是通过一个 bias 来控制的