I’ve been trying to get a 3D texture mapping working on some CT data. (16 bit grey scale data)
The images a 512 x 512 with 22 slices…
Here is the code I use to create the texture…
The ThreeDTexture is a simple structure that has the width, height and depth along with a pointer to the ‘unsigned short’ data.
When I view this all is see is a white cube.
I’m thinking perhaps I either have my textcords and or verticies wrong or that OpenGL doesn’t support 16 bit grey scale or that I haven’t initialized OpenGL correctly.
The ideal image would be a MIP image… i.e. a maximum intensity projection…
- (void) makeCube:(int) name s:(GLfloat *)s text:(ThreeDTexture *)text
{
int imageWidth, imageHeight, imageDepth;
imageWidth = text->width;
imageHeight = text->height;
imageDepth = text->depth;
glNewList(name, GL_COMPILE);
glPushMatrix();
glScalef(s[0], s[1], s[2]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage3D(GL_TEXTURE_3D,
0,
GL_INTENSITY16,
imageWidth,
imageHeight,
imageDepth,
0,
GL_LUMINANCE,
GL_UNSIGNED_SHORT,
(GLvoid *) text->image);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBegin(GL_QUADS);
// Do the six faces of the cube...
//front
glTexCoord3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 0.0f, 0.0f); glVertex3f(+1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 0.0f); glVertex3f(+1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
//right side
glTexCoord3f(1.0f, 0.0f, 0.0f); glVertex3f(+1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 0.0f, 1.0f); glVertex3f(+1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 1.0f); glVertex3f(+1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 0.0f); glVertex3f(+1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
//back
glTexCoord3f(1.0f, 0.0f, 1.0f); glVertex3f(+1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 1.0f, 1.0f); glVertex3f(-1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 1.0f); glVertex3f(+1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
//left side
glTexCoord3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 1.0f, 1.0f); glVertex3f(-1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
// top
glTexCoord3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 0.0f); glVertex3f(+1.0f, +1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 1.0f, 1.0f); glVertex3f(+1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 1.0f, 1.0f); glVertex3f(-1.0f, +1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
// bottom
glTexCoord3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 0.0f, 1.0f); glVertex3f(+1.0f, -1.0f, +1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glTexCoord3f(1.0f, 0.0f, 0.0f); glVertex3f(+1.0f, -1.0f, -1.0f); //glNormal3f(<#GLfloat nx#>,<#GLfloat ny#>,<#GLfloat nz#>)
glEnd();
glPopMatrix();
glEndList();
}
- (BOOL) initGL
{
glShadeModel( GL_SMOOTH ); // Enable smooth shading
glClearColor( 0.0f, 0.0f, 0.0f, 0.5f ); // Black background
glClearDepth( 1.0f ); // Depth buffer setup
glEnable( GL_DEPTH_TEST ); // Enable depth testing
glDepthFunc( GL_LEQUAL ); // Type of depth test to do
// Really nice perspective calculations
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
// added for mip.
// glBlendEquationEXT(GL_MAX_EXT)
// mine.
//glEnable(GL_CULL_FACE);
//glCullFace(GL_BACK);
glEnable(GL_TEXTURE_3D);
[self createObjects];
return TRUE;
}