1

我想对大于 GPU 内存的大型数据集实现基于 GPU 的光线投射体积渲染。我尝试这样做:

(1)首先我将体积分成大小相等的砖块。

(2)然后我根据传递函数决定每块砖是否透明。

(3)然后我将不透明的砖块存储到“Packed-Texture”中。为了在光线投射渲染期间进行采样,我创建了另一个名为“Index-Texture”的纹理,它将砖块索引存储在 Packed-Texture 中。

当我在着色器中渲染期间进行采样时,首先我计算采样点在哪个砖块中。然后我访问索引纹理以获取采样点的值。但默认值是插值后的值,而不是正确地在 Packed-Texture 中的砖的索引。

所以,我的问题是:在光线投射渲染期间进行采样时,如何从索引纹理中正确获取 Packed-Texture 中的砖索引(采样点所在的位置)?

4

1 回答 1

2

这不是一个真正的问题,假设您的体积立方体从 [0, 1]³ 开始,然后您将其拆分为每个方向 8 个块。然后将小数坐标乘以 8(或其他)并向下舍入到最接近的整数,从而为您提供索引。向下舍入后,您从缩放的分数坐标中减去索引,这会为您提供子块中的分数位置,即

volcube_pos = volcube_frac_pos * volcube_blocks;
volcube_index = (int)floor(volcube_pos);
subblock_pos = volcube_pos - volcube_index;

现在所有这些块都必须存储在某个地方。将它们放入常规的、打包的 3D 纹理中需要禁用过滤、注意栅栏问题 ( https://stackoverflow.com/a/5879551/524368 ) 并自己进行所有过滤插值。

另一种方法是使用 NVidia 的无绑定纹理,而不是打包纹理。

于 2012-10-24T09:31:10.587 回答