マーチング四面体を使用して、.rawボリューム医療データセットの3Dビジュアライザーを作成したいと思います。
この実装はGPLライセンスで見栄えがよく、Paul Bourkeの情報に基づいていますが、3Dテクスチャとして読み込まれる.rawファイルを使用して作業する方法がわかりません。
//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テクスチャにロードした後に値にアクセスする
各x、y、zで等値面強度を取得するためにpVolumeにインデックスを付ける方法がわかりません。pVolumeが1D配列の場合。x、y座標が除算とモジュールを使用して1D配列からマップされることは知っていますが、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変換を行う方が良いですか?