Help:questions about three-dimensional textures

Started by
2 comments, last by dimebolt 18 years, 9 months ago
I have compiled the example about 3d textures in <the red book> version 1.4,and run it,the result is two squares. 源代码如下:

#include &lt;GL/glut.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;gl/glext.h&gt;

#ifdef GL_VERSION_1_2
#define        iWidth 16
#define        iHeight 16
#define iDepth 16

static GLubyte image[iDepth][iHeight][iWidth][3];
static GLuint texName;
PFNGLTEXIMAGE3DPROC glTexImage3D;
/*  Create a 16x16x16x3 array with different color values in
*  each array element [r, g, b].  Values range from 0 to 255.
*/

void makeImage(void)
{
   int s, t, r;
    
   for (s = 0; s &lt; 16; s++)
      for (t = 0; t &lt; 16; t++)
         for (r = 0; r &lt; 16; r++) {
            image[r][t][<span class="cpp-number">0</span>] = (GLubyte) (s * <span class="cpp-number">17</span>);
            image[r][t][<span class="cpp-number">1</span>] = (GLubyte) (t * <span class="cpp-number">17</span>);
            image[r][t][<span class="cpp-number">2</span>] = (GLubyte) (r * <span class="cpp-number">17</span>);
         }
}

<span class="cpp-keyword">void</span> init(<span class="cpp-keyword">void</span>)
{    
   glClearColor (<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glShadeModel(GL_FLAT);
   glEnable(GL_DEPTH_TEST);

   makeImage();
   glPixelStorei(GL_UNPACK_ALIGNMENT, <span class="cpp-number">1</span>);

   glGenTextures(<span class="cpp-number">1</span>, &amp;texName);
   glBindTexture(GL_TEXTURE_3D, texName);
   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_NEAREST);
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, 
                   GL_NEAREST);
   glTexImage3D=(PFNGLTEXIMAGE3DPROC)wglGetProcAddress(<span class="cpp-literal">"glTexImage3D"</span>;
   glTexImage3D(GL_TEXTURE_3D, <span class="cpp-number">0</span>, GL_RGB, iWidth, iHeight,
                iDepth, <span class="cpp-number">0</span>, GL_RGB, GL_UNSIGNED_BYTE, image);
   glEnable(GL_TEXTURE_3D);
}

<span class="cpp-keyword">void</span> display(<span class="cpp-keyword">void</span>)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glBegin(GL_QUADS);   <span class="cpp-comment">//&amp;#30011;&amp;#22235;&amp;#36793;&amp;#24418;</span>
   glTexCoord3f(<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>); glVertex3f(-<span class="cpp-number">2</span>.<span class="cpp-number">25</span>, -<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>); glVertex3f(-<span class="cpp-number">2</span>.<span class="cpp-number">25</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>); glVertex3f(-<span class="cpp-number">0</span>.<span class="cpp-number">25</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>); glVertex3f(-<span class="cpp-number">0</span>.<span class="cpp-number">25</span>, -<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);

   glTexCoord3f(<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>); glVertex3f(<span class="cpp-number">0</span>.<span class="cpp-number">25</span>, -<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>); glVertex3f(<span class="cpp-number">0</span>.<span class="cpp-number">25</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>); glVertex3f(<span class="cpp-number">2</span>.<span class="cpp-number">25</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glTexCoord3f(<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>); glVertex3f(<span class="cpp-number">2</span>.<span class="cpp-number">25</span>, -<span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>);
   glEnd();
   glFlush();
}

<span class="cpp-keyword">void</span> reshape(<span class="cpp-keyword">int</span> w, <span class="cpp-keyword">int</span> h)
{
   glViewport(<span class="cpp-number">0</span>, <span class="cpp-number">0</span>, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(<span class="cpp-number">60</span>.<span class="cpp-number">0</span>, (GLfloat) w/(GLfloat) h, <span class="cpp-number">1</span>.<span class="cpp-number">0</span>, <span class="cpp-number">30</span>.<span class="cpp-number">0</span>);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(<span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, -<span class="cpp-number">4</span>.<span class="cpp-number">0</span>);
}

<span class="cpp-keyword">void</span> keyboard(<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> key, <span class="cpp-keyword">int</span> x, <span class="cpp-keyword">int</span> y)
{
   <span class="cpp-keyword">switch</span> (key) {
      <span class="cpp-keyword">case</span> <span class="cpp-number">27</span>:
         exit(<span class="cpp-number">0</span>);
         <span class="cpp-keyword">break</span>;
   }
}

<span class="cpp-keyword">int</span> main(<span class="cpp-keyword">int</span> argc, <span class="cpp-keyword">char</span>** argv)
{
   glutInit(&amp;argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(<span class="cpp-number">250</span>, <span class="cpp-number">250</span>);
   glutInitWindowPosition(<span class="cpp-number">100</span>, <span class="cpp-number">100</span>);
   glutCreateWindow(argv[<span class="cpp-number">0</span>]);
   init();
   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutKeyboardFunc (keyboard);
   glutMainLoop();
   <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>; 
}

#<span class="cpp-keyword">else</span>
<span class="cpp-keyword">int</span> main(<span class="cpp-keyword">int</span> argc, <span class="cpp-keyword">char</span>** argv)
{
    fprintf (stderr, <span class="cpp-literal">"This program demonstrates a feature which is not in OpenGL Version 1.0 or 1.1.\n"</span>;
    fprintf (stderr, <span class="cpp-literal">"If your implementation of OpenGL has the right extensions,\n"</span>;
    fprintf (stderr, <span class="cpp-literal">"you may be able to modify this program to make it run.\n"</span>;
    <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;
}
<span class="cpp-directive">#endif</span>

</pre></div><!–ENDSCRIPT–>

here are my questions:
1.how to show the 3d object mapped with 3d textures? 
In this programe it is a volume data mapped with 3d textures, how to show this object in 3 dimensions? 
2.3d textures mapping must be better than 2d textures,what is its features? 

Thank you for your reading and reply!

<small>Added source tags, plesae check the <a href="http://www.gamedev.net/community/forums/faq.asp">Forum FAQ</a> to find out which tags can be used &#111;n this board and use them in future</small>

<!–EDIT–><span class=editedby><!–/EDIT–>[Edited by - _the_phantom_ on June 30, 2005 12:08:01 AM]<!–EDIT–></span><!–/EDIT–>
Advertisement
I'm not quite sure what you mean by the first question.

To show an object within 3 dimensions, the easiest thing to do is to rotate around the object, and have it moving up/down/left/right/forwards/backwards. Rendering billions (or trillions) of pixels from images to create a 3D model isn't exactly a viable option on today's machines.

To use 3d textures, you use glTexCoord3f() (or something similar, depending on what you're doing).

3D textures provide blending between the layers, so you can blend between two different textures, showing one more than the other. Google is your friend.

You can use 3D textures for things like heightmaps, but unless you have a videocard that supports 3D textures properly, you wont get good results (example: a GeForce 2 does support 3D textures, but you'll be lucky to get 1 FPS when they're on the screen). You'll also need a decent number of different layers, or the blending between them can give you results that look worse than two completely different layers being side-by-side (for example: sand and grass).
Thank you! The first question is how to show the volume which has been mapped with 3d-texture. Should I need to draw triangles or quads one by one to show the volume?
If you wish to perfrom volume rendering using 3D textures, you should attach the texture to a set of polygons that cut through the 3D volume and are perpendicular to the viewing vector.

This site has a step by step explanation of the algorithm:
http://www.opengl.org/resources/tutorials/advanced/advanced97/notes/node181.html

Instead of the curved shells I would use flat polygons (quads and triangles) as depicted in the left-most picture of slide 5 of the following presentation:
http://www.sci.utah.edu/~jmk/vis02/Part2_TextureBased.ppt

The reason to use 3D textures instead of 2D textures is that the interpolation between pixels is then also extended to z (or r) direction. 2D textures are only interpolated in the x and y (or s, t) direction

If your graphics card is recent, you might want to try ray casting using fragment shaders. That will give higher quality images.

Tom

This topic is closed to new replies.

Advertisement