3

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 级别。但是目前体积采样步长太大了……尽管如果与相机的距离减小,它会减小。

4

1 回答 1

-3

你正在做的事情有很多问题。

  • 为什么不让 gpu 自己选择正确的 miplevel?只需在步进位置上采样。

  • 您的缩放比例可能是错误的。

  • 让司机为您选择合适的级别,认真。

  • 想想三线性采样是如何工作的。然后想想它是如何处理卷的。

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

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

  • fwidth 对于步进更快或更慢很有用

于 2011-06-30T11:10:44.967 回答