OpenGL - 3D纹理 - 概念问题

时间:2014-02-06 23:09:45

标签: opengl volume-rendering 3d-texture

我在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=Position&view=Normal&spc=Relaxed&select=4729498&fr=1#xx4738025xx

本教程中使用的数据集的尺寸为256 x 256 x 109(109个2D切片)

1

该代码提供了一种通过将所有2D切片加载到单个数据阵列中来将2D图像映射到3D纹理的方法。然后,通过以fIndx为步长将-1.0f+1.0f增加到0.003f,继续将数据映射到3D纹理。为什么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个切片,我想逐个浏览每个切片。如何像在视频中一样逐个浏览切片?

1 个答案:

答案 0 :(得分: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 ]范围内的256个唯一值(NDC坐标空间),则应从 -1.0 并在每次迭代时以 1 / 128 0.0078125 )递增。