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将同步所有线程并使用顶部和右侧邻居线程计算派生。
在遍历期间i插值范围线性:
// 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级别。但目前音量采样步长是大的......如果相机距离减小,它会减少。
答案 0 :(得分:-2)
你正在做的事情有很多不妥之处。
为什么不让gpu选择正确的miplevel呢?只需在踩踏位置进行采样。
您的缩放可能不对。
让司机认真选择合适的等级。
想想三线性采样是如何工作的。然后考虑它如何适用于卷。
fwidth不是确定miplevel的正确方法,即使你想要最近的一个。
我是否说让GPU进行miplevel选择?
fwidth对于更快或更慢的步进非常有用