1

我有一些关于 OpenGL 中的 3D 纹理和纹理映射的概念性问题,我正试图解决这些问题。问题与代码的实现有关,尤其是本教程中的 3D 纹理:http: //www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering? fid=1807805&df=90&mpp=25&noise=3&prof =False&sort=位置&view=正常&spc=放松&select=4729498&fr=1#xx4738025xx

教程中使用的数据集的维度是256 x 256 x 109 (109 2D slices)

1.

该代码提供了一种通过将所有 2D 切片加载到单个数据数组中来将 2D 图像映射到 3D 纹理的方法。然后,它继续将数据映射到 3D 纹理,方法是fIndx-1.0f到 以+1.0f为步长递增0.003f。为什么增量是0.003f? 大约有 666.667 个增量,大约是 2D 切片总数(109 个切片)的 6.11 倍。

for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
{
    glBegin(GL_QUADS);
        MAP_3DTEXT( fIndx );
    glEnd();
}

2.

我试图弄清楚如何使用 3D 纹理在渲染体积中移动。我正在尝试做的是类似于这个网站上的视频:http: //cvlab.epfl.ch/research/medical/em/synapses

当然,该网站中的数据必须是映射到 2D 纹理的 2D 图像。所以,让卷中的每一层都消失显然很容易(但是,我不知道该怎么做!)。我的数据看起来像这样:http ://ctrlv.in/292069

编辑

我的数据集中有 256 个切片,我想逐个浏览每个切片。我怎样才能像视频中一样逐个移动切片?

4

1 回答 1

3

1.

为什么确实...浮点循环逻辑是邪恶的。0.003f不能用浮点数表示。经过 256 次迭代后,循环计数器现在是 ~= -0.231997而不是-0.232。最好使用整数控制表达式执行此循环,然后在循环体内将最终结果除以1000.0f 。我不相信本教程的作者会编写任何财务软件。他们会因为做这样的事情而失去你的钱;)

0.003f实际上是 ~ 0.003000000026077032089233398438...(它是浮点中的重复数字,因为它不能表示为除以 2 的幂)。在累积了足够多的舍入误差后,值的差异可能足以使您的循环计数逻辑失效。如此之多,即使该数字以足够大的步长增加以仅处理 190 个切片,循环运行的时间也会减少 1 次,并且您会丢失一个切片。

如果您有 256 个切片,并且每次迭代递增1 / 256(使用 2 分母的幂次方表示),则浮点循环控制将起作用。唉,3 / 1000没有这样的属性。这是用于循环的错误浮点值。由于找出是否可以使用浮点精确表示一系列数字是一件麻烦事,因此通常最好完全避免浮点循环。

2.

如果您希望在 [ -1.0 , 1.0 ] (NDC 坐标空间)范围内有 256 个唯一值,则应从-1.0开始,每次迭代恰好递增1 / 128 ( 0.0078125 )。

于 2014-02-07T00:06:59.950 回答