作业1中poissonDiskSamples函数里的采样点生成代码如下:
for( int i = 0; i < NUM_SAMPLES; i ++ ) {
poissonDisk[i] = vec2( cos( angle ), sin( angle ) ) * pow( radius, 0.75 );
radius += radiusStep;
angle += ANGLE_STEP;
}
如果这里是为了生成单位圆上的均匀采样,应该是pow(radius, 0.5)才对吧。就像均匀采样函数uniformDiskSamples里面radius = sqrt(sampleY)一样。
参考虎书sampling一章的证明:
假设用极坐标r,θ表示单位圆上的一点s,则有ds = r * dr * dθ。
若令r = pow(radius, 0.5), θ = angle,则有ds = d(0.5 * r^2) * dθ = 0.5 * d(radius) * d(angle),即在radius-angle空间均匀采样等于在单位圆上均匀采样。
若令r = pow(radius, 0.75), θ = angle,则有ds = (3/4) * sqrt(radius) * d(radius) * d(angle),此时在radius-angle空间的均匀采样并不等于在单位圆上均匀采样。