我在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个切片,我想逐个浏览每个切片。如何像在视频中一样逐个浏览切片?
答案 0 :(得分:3)
为什么......浮点循环逻辑是邪恶的。 0.003f 无法以浮点表示。在说了256次迭代之后,循环计数器现在是〜= -0.231997 而不是 -0.232 。最好使用整数控制表达式执行此循环,然后在循环体内将最终结果除以 1000.0f 。我不相信本教程的作者编写任何财务软件。他们会通过做这样的事情来赔钱;)
0.003f 实际上是〜 0.003000000026077032089233398438 ... (它是浮点数的重复数,因为它不能表示为除以2的幂)。在累积了足够的舍入误差之后,值的差异足以甩掉循环计数逻辑。这么多,即使这个数字的步长增加到足以只处理190个切片的步数,循环也会减少1个时间并且你会错过一个切片。
如果您有256个切片,并增加 1 / 256 (使用2的幂分母表示)迭代,浮点循环控制将起作用。唉, 3 / 1000 没有这样的属性。这是用于循环的错误浮点值。由于发现是否可以使用浮点精确表示一系列数字是令人讨厌的,因此通常最好完全避免浮点循环。
如果您想要[ -1.0 , 1.0 ]范围内的256个唯一值(NDC坐标空间),则应从 -1.0 并在每次迭代时以 1 / 128 ( 0.0078125 )递增。