How to load a 3D image file in using OpenGL

Hi,

First, I have not enough experience with OpenGL;

I have a problem; my goal is to calculate the MIP images of
a 3D volume image (PET image); the data is stored in a file with extension .dat (just raw data); each voxel value is represented as float number. I know that it is possible to calculate the MIP using the followuing equation:

finalColor = blendingEq(blendFunc1(src), blendFunc2(dst));

However, I do not know how to load the values of the 3D image,
according to OpenGL; in order to then apply the over mentioned equation.

Could somebody help me?

Thanks!

My first impression from reading your question is that you are vastly oversimplifying a fairly complex task. Forget about OpenGL and what you want to display for a moment. Are you able to read your voxel data with a C or C++ program? Are you aware that you are going to have to use a programming language like ‘C’ to read your data, do the calculations, then make the appropriate OpenGL calls to display the result? OpenGL is a library of subroutines that must be called from a programming language. It is not a standalone application or visualization package.

By the way, by “MIP”, you actually mean “maximum intensity projection”, not the well-know-here mipmapping (“multum in parvo” mapping).

Tutorial about 3D textures :
http://gpwiki.org/index.php/OpenGL_3D_Textures

Ok,

Yes I have experience in C, and C++; currecntly, I am working on
reconstruction problems; I wrote a program which is able to reconstruct data from a particular small animal PET scanner; but now I would like to visualise the 3D image obtained after the reconstruction.
To answer your questions:

Are you able to read your voxel data with a C or C++ program?

  • Yes I can do that

Are you aware that you are going to have to use a programming language like ‘C’ to read your data, do the calculations, then make the appropriate OpenGL calls to display the result?

  • Yes, I am aware; in fact, I already have the 3D image located in memory; but, I do not know how to asociate the image with the OpenGL functions; I already include the library within my program. I know that there are algorithims to calculate the MIP (I have some articles about that); but I was looking for a function in OpenGL that could help me to do that.

thanks,

Yes, I am talking about Maximum Intensity Projection

In OpenGL, everything is drawn as triangles.
So to draw a 3D volume, is has to be emulated.
For example, with a stack of planes, each plane facing the camera.
With blending active, and the blend equation set to max function, as you where told in your previous thread :
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=258768#Post258768

Start from the 3D texture example I linked above.

More clever rendering can be done using multitexturing, raycasting using GLSL shader, etc, depending on your needs and the target hardware.

Dinara - what do you mean by ‘have the 3D image located in memory’? In what form is it? Have you already done the calculations which cast rays through your 3D data, generating a 2D array which you want to display as an image? Are you asking us how to display that 2D image? Because that is trivial. OR - are you asking how to actually cast rays through your 3D data set to generate an image?

Thanks for your suggestions!

Dear MaxH

What do you mean for “in what form”?

I have the 3D image located in memory, each voxel is
defined by a float number, and I have a pointer given the
reference. That is what I have, the raw data. I know that I need to calculate the path of the ray through the data per angle, and that is what I am looking for, a function that could do that; but at different angles in order to get a set of 2D projection with the intention of simulate 3D animation of PET image.

I know that it is a trivial calulation when tha proyection is done along x, y and z direction; however, in order to do the animation I need projections per a sample angle.

Maybe there is no function that could do that, and I have to calculate each projection implementing a function for that.

So you’re talking about doing volume visualization. It can be done via an iso-surface approach or a simplified form of raytracing (where rays aren’t bounced or bent). Neither one seems trivial to me. You’d have to do quite a bit of programming on top of OpenGL to get results. Years ago I wrote an iso-surface utility. It was made up of about 10,000 lines of code. Have you considered using a scientific visualization package? I think you can get them for free from universities. Good luck.

If you only want an MIP generated, without implementing it yourself, try the free version of KB-Vol3D Toolkit:

http://kbvis.com/downloads/kbvtk_2_0_eval.zip (VC++ version)
http://kbvis.com/downloads/kbvtk_2_0_eval_bc.zip
(Borland C++ Builder version)

You can add your own volume file reading code. The volume can be rendered using Colour, Grayscale, MIP or MinIP modes.