我想使用行进四面体创建 .raw 体积医疗数据集的 3D 可视化器。
我在 GPL 许可证上发现这个实现看起来不错,并且基于 Paul Bourke 的信息,但我不知道如何使用 .raw 文件,我发现人们将其加载为 3d 纹理。
//assuming that the data at hand is a 256x256x256 unsigned byte data
int XDIM=256, YDIM=256, ZDIM=256;
const int size = XDIM*YDIM*ZDIM;
bool LoadVolumeFromFile(const char* fileName) {
FILE *pFile = fopen(fileName,"rb");
if(NULL == pFile) {
return false;
}
GLubyte* pVolume=new GLubyte[size]; //<- here pVolume is a 1D byte array
fread(pVolume,sizeof(GLubyte),size,pFile);
fclose(pFile);
// now pVolume is passed to a 3d texture
//load data into a 3D texture
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_3D, textureID);
// set the texture parameters
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D,0,GL_INTENSITY,XDIM,YDIM,ZDIM,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,pVolume);
delete [] pVolume;
return true;
}
我不知道我是否应该:a)直接从 pValue 访问值 b)在将它们加载到 3D 纹理后访问它们
我不知道我应该如何索引 pVolume 以获得每个 x、y、z 的等值面强度。如果 pVolume 是一维数组。我知道 x,y 坐标是使用除法和模块从一维数组映射的,但是我将如何映射 x,y,z?
另一方面,如果我将 .raw 文件加载为 3d 纹理会
glTexCoord3f
给我给定 x,y,z 的等值?
澄清:问题不是“OpenGL 可以直接从中绘制等值面吗?” 问题是如何索引 .raw 几何上的等值线,这是正确评估每个四面体所必需的。在图像上,可以看到每个四面体情况都根据等值面是高于还是低于它来标记。等值面在 .raw 文件上的 x、y、z 坐标上进行索引,如何为数据集上的每个 x、y、z 访问它?glTexCoord3f 会在给定的 x、y、z 上给我它的强度吗?直接从 pVolume 数组进行 ax,y,z 转换会更好吗?