我想实现大于GPU内存的大型数据集的基于GPU的光线投射体绘制。我尝试这样做:
(1)首先,我将体积分成相同大小的砖块。
(2)然后根据传递函数判断每块砖是否透明。
(3)然后我将非透明砖存储到“Packed-Texture”中。为了在光线投射渲染期间进行采样,我创建了另一个名为“Index-Texture”的纹理,它将砖块索引存储在Packed-Texture中
当我在着色器中进行渲染时进行采样时,首先我计算采样点在哪个砖中。然后我访问索引纹理以获取采样点的值。但是默认情况下,值是在插值后,并且不正确是Packed-Texture中砖的索引。
所以,我的问题是:在光线投射渲染过程中进行采样时,如何正确地从Index-Texture获取Packed-Texture中的砖块索引(其中采样点是)?
答案 0 :(得分: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纹理中需要禁用过滤,注意fencepost问题(https://stackoverflow.com/a/5879551/524368)并自行进行所有过滤插值。
另一种方法,而不是打包纹理,我将调查自己 - 因为我正在研究自己现在的体积渲染 - 正在使用NVidia的无边框纹理。