GLSL 函数 fwidth(p) 究竟做了什么?
我知道它被实现为:
fwidth(p) = abs(dfdx(p)) + abs(dfdy(p))
但我不确定我是否得到它。
我在这里做一些基本的光线投射并尝试计算所需的 miplevel。要找到 miplevel,请在光线撞击体积的坐标上调用 fwidth(在纹理空间中)。
// get 'derivate width' of sampling position
vec3 width = fwidth(current_position_in_texture_space * size_of_texture);
// get radius around current position in voxels
float range = length(width);
// calculate factor for interpolation (see below)
float factor = range / distance_from_camera_to_current_position;
据我了解,GLSL 将同步所有线程并计算与顶部和右侧相邻线程的导数。
在遍历期间,我对范围进行线性插值:
// during traversal
float new_range = distance_from_camera_to_current_position * factor;
// calculate mip level from voxel range
float level = log2(new_range);
// get new sampling stepsize
float stepsize = new_range * 0.5;
如果这是正确的级别,则应该是对当前位置进行采样所需的 mip 级别。但是目前体积采样步长太大了……尽管如果与相机的距离减小,它会减小。