Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL-三维纹理-概念问题_Opengl_Volume Rendering_3d Texture - Fatal编程技术网

OpenGL-三维纹理-概念问题

OpenGL-三维纹理-概念问题,opengl,volume-rendering,3d-texture,Opengl,Volume Rendering,3d Texture,我有一些关于OpenGL中的3D纹理和纹理映射的概念性问题,我正试图对此进行深入研究。本教程中的问题与代码的实现有关,特别是3D纹理: 本教程中使用的数据集的尺寸为256 x 256 x 109(109个2D切片) 1. 该代码提供了一种将2D图像映射到3D纹理的方法,方法是将所有2D切片加载到单个数据数组中。然后,它通过以0.003f的步骤将fIndx从-1.0f增加到+1.0f将数据映射到3D纹理。为什么步进增量为0.003f?大约有666.667个增量,约为2D切片总数(109个切片)的6

我有一些关于OpenGL中的3D纹理和纹理映射的概念性问题,我正试图对此进行深入研究。本教程中的问题与代码的实现有关,特别是3D纹理:

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

1.

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

for(float fIndx=-1.0f;fIndx 1。
为什么…浮点循环逻辑是邪恶的。0.003f不能用浮点表示。在256次迭代之后,循环计数器现在是~=-0.231997,而不是-0.232。最好使用整数控制表达式执行此循环,然后将最终结果除以rong>1000.0f在循环体内部。我不会相信本教程的作者编写任何金融软件。他们这样做会让你赔钱;)

0.003f实际上是~0.0030000000260770320389233398438…(它是一个浮点数的重复数,因为它不能表示为二的幂除)。在累积了足够多的舍入误差后,值之间的差异就足以摆脱循环计数逻辑。如此之多,以至于即使这个数字以足够大的步长递增,只处理190个片段,循环运行的时间也会少1次,并且会丢失一个片段

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

2.
如果希望256个唯一值位于[-1.01.0](NDC坐标空间)范围内,则应从-1.0开始,并在每次迭代中精确增加1/1280.0078125)。

完美!谢谢你的解释!现在这是有道理的。但是,我不希望在循环中使用浮点值,我更希望只使用整数来实现纹理映射。另外,我想我在第二个问题中没有说清楚。我想知道如何通过视频中显示的不同图像层移动是的,我现在明白你的意思了。如果要绘制一系列四边形来完成此操作,可以从更高的索引开始,也可以选择动态调整剪裁平面。由于3D体积在链接到的视频中是旋转的,我认为简单地跳过几个四边形将是最简单的解决方案。嗯,我不能跳过四边形。我正在处理的数据是角膜组织的横截面。因此,我需要在显示下一个图像之前使每个图像消失。我不知道如何使每个图像在渲染后消失?我可以使用glScissor函数,但是,我需要确保我渲染的其他纹理没有被剪裁。因此,我尝试使用更高的索引,但它不适用于3D纹理教程网页中的示例代码。每个四边形表示体积的一部分,对吗?使图像消失应该像清除颜色缓冲区一样简单,然后重新绘制四边形(没有您不再感兴趣的切片)。现在,为了在该视频中实现效果,您实际上不想立即移除四边形-您应该在每帧稍微向后移动它,直到它到达下一个切片(然后移除它)。这一切都假定纹理坐标与位置相关。顺便说一句,datenwolf是这方面的专家,他可能还有更多要补充的内容。
for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
{
    glBegin(GL_QUADS);
        MAP_3DTEXT( fIndx );
    glEnd();
}