Jump to content
  • Advertisement
Sign in to follow this  
TheWickedD

OpenGL glColorTable with textures

This topic is 3632 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi All, I'm hardly experienced in OpenGL, but here are my thoughts. I have a project in which I have one fixed texture that will only change color every frame. Later, it will have to be displayed real time, so I thought it would be easy to just draw the same texture all the time and only change the colortable underlying it. For this purpose I have adapted some sample code from the red book. However, it seems the glcolortable calls have no effect. What am I missing? A second question: Can I define my texture as a 2D array (e.g. tex[row][column]) where each value is an index into the colortable? Colortable examples I find online all seem to work on 3D (RGB in third dimension) texture-array, but that doesn't work for me here also. Thanks! Here is my code:
#include <glew.h>
#include <freeglut.h>
#include <stdlib.h>
#include <stdio.h>

#define	checkImageWidth 80
#define	checkImageHeight 60
static GLubyte checkImage[checkImageHeight][checkImageWidth][3];

static GLuint texName;

void makeCheckImage(void)
{
   int i, j, c;
    
   for (i = 0; i < checkImageHeight; i++) {
      for (j = 0; j < checkImageWidth; j++) {
         c = ((((i&0x8)==0)^((j&0x8))==0))*255;
         checkImage[j][0] = (GLubyte) c;
         checkImage[j][1] = (GLubyte) c;
         checkImage[j][2] = (GLubyte) c;
      }
   }
}

void init(void)
{    
   glClearColor (0.0, 0.0, 0.0, 0.0);

   makeCheckImage();

   glGenTextures(1, &texName);
   glBindTexture(GL_TEXTURE_2D, texName);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, checkImageWidth, checkImageHeight, 
                0, GL_RGB, GL_UNSIGNED_BYTE, checkImage);
   
   float ColorTable[256][3];
   for (int i=0;i<256;i++)
   {
       // initialize to 0
       ColorTable[0] = 0.0f;
       ColorTable[1] = 0.0f;
       ColorTable[2] = 0.0f;
   }
   ColorTable[0][0] = 0.5f;
   ColorTable[0][1] = 0.0f;
   ColorTable[0][2] = 0.0f;
   ColorTable[255][0] = 0.0f;
   ColorTable[255][1] = 1.0f;
   ColorTable[255][2] = 1.0f;
   glColorTable(GL_COLOR_TABLE, GL_RGB, 256, GL_RGB, GL_FLOAT, ColorTable);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glEnable(GL_TEXTURE_2D);
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glBindTexture(GL_TEXTURE_2D, texName);
   glEnable(GL_COLOR_TABLE);

   glBegin(GL_QUADS);
   glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
   glEnd();
   glutSwapBuffers();
   glDisable(GL_TEXTURE_2D);
   glDisable(GL_COLOR_TABLE);
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(-2,2,-2,2,-1,1);
}

void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize(250, 250);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(argv[0]);
   glewInit();
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0; 
}

[Edited by - TheWickedD on October 11, 2008 12:11:18 AM]

Share this post


Link to post
Share on other sites
Advertisement
You should call glGetError before and after glColorTable.
If after glColorTable, you get GL_INVALID_OPERATION, then the drivers don't support the imaging subset of GL, of which glColorTable is part of.

Share this post


Link to post
Share on other sites
Hi V-man,

Thanks for the tip. Using GlGetError I found that no error (glColorTable related or otherwise) occurs at any time during execution of the program.

Extra info I just figured out how to retrieve: OpenGL reports version 2.1.2. I'm running on Windows XP with an Nvidia Quadro FX 1500 and updated drivers.

Seems I am somehow forgetting something to enable the colormap, or the current mix of texture drawing and colormap is not correct.

Thanks for the help!

Share this post


Link to post
Share on other sites
Hmm, so never minding the code,
I guess the question is how do I implement the following:
Use an indexed texture (just a single layer, with indices into a color table) and specify a colortable (color lookup table) to color the texture.

Which commands should I use and are there any things I should pay special attention to?

I've tried about 7 possible leads that I found with Google and none seem to make a difference.

Thanks!

Share this post


Link to post
Share on other sites
Well, in general, common GPUs don't support color indexing but if you really want to see what will happen
I'm guessing you need to reference the indices

glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX, checkImageWidth, checkImageHeight,
0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, checkImage);

It's possible that the driver will just convert to GL_RGBA8.

The other way way to do color indexing is to use a texture and a fragment shader.

Share this post


Link to post
Share on other sites
Hi V-man,

Thank you for the suggestion. I'll look into the shaders, hopefully the implementation of those on the different brands and models of recent graphics cards will be similar. I've given up hope on these ``older'' extentions. Seems on my brand new ATI here glColorTable doesn't exist, where on the Quadro glColorTable has no effect (i've tried the GL_COLOR_INDEX stuff before).

Anyway, shaders are nice and flexible, it will be cool to learn more about them.

Thanks again!

For others with these kind of questions, as a first lead I've found http://www.lighthouse3d.com/opengl/glsl/index.php?color, which seems promising. Example code downloadable at bottom of page

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!