用fwidth确定miplevel

时间:2011-05-06 12:21:10

标签: opengl glsl raytracing

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级别。但目前音量采样步长是大的......如果相机距离减小,它会减少。

1 个答案:

答案 0 :(得分:-2)

你正在做的事情有很多不妥之处。

  • 为什么不让gpu选择正确的miplevel呢?只需在踩踏位置进行采样。

  • 您的缩放可能不对。

  • 让司机认真选择合适的等级。

  • 想想三线性采样是如何工作的。然后考虑它如何适用于卷。

  • fwidth不是确定miplevel的正确方法,即使你想要最近的一个。

  • 我是否说让GPU进行miplevel选择?

  • fwidth对于更快或更慢的步进非常有用