XiaJun
XiaJun

Reputation: 1915

Load bmp file as texture using auxDIBImageLoad in OpenGL

I am learning OpenGL NeHe Production.When I read lesson22 Bump-Mapping、Multi-texture,I got a problem.

When I load logo bmp file,I need to load two bmp files:one stores color information ,and another stores alpha information. here is the two bmp files: OpenGL_Alpha.bmp: enter image description here

and OpenGL.bmp : enter image description here

Here is the code:

if (Image=auxDIBImageLoad("Data/OpenGL_ALPHA.bmp")) {
            alpha=new char[4*Image->sizeX*Image->sizeY];
            for (int a=0; a<Image->sizeX*Image->sizeY; a++)
                    alpha[4*a+3]=Image->data[a*3]; //???????
            if (!(Image=auxDIBImageLoad("Data/OpenGL.bmp"))) status=false;
            for (a=0; a<Image->sizeX*Image->sizeY; a++) {
                    alpha[4*a]=Image->data[a*3];//??????????                         
                    alpha[4*a+1]=Image->data[a*3+1];             
                    alpha[4*a+2]=Image->data[a*3+2];                     
            }

            glGenTextures(1, &glLogo);  

            glBindTexture(GL_TEXTURE_2D, glLogo);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Image->sizeX, Image->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
            delete alpha;

}

My question is :why the index of Image->data is a*3???

Could someone interpret for me ?

Upvotes: 0

Views: 4468

Answers (2)

luke
luke

Reputation: 37453

It's the channel offset. The RGB data is stored as three consecutive bytes. Here 'a' represents which pixel (group of 3 bytes, one for R, one for G, one for B).

Think of a*3 as a pointer to an array of 3 bytes:

char* myPixel = Image->data + (a*3);

char red   = myPixel[0];
char green = myPixel[1];
char blue  = myPixel[2];

Upvotes: 0

datenwolf
datenwolf

Reputation: 162164

I am learning OpenGL NeHe Production.When I read lesson22 Bump-Mapping

Why? The NeHe tutorials are terribly outdated, and the Bump Mapping technique outlined there completely obsolete. It's been superseeded by shader based normal mapping for well over 13 years (until 2003 texture combiners were used instead of shaders).

Also instead of BMPs you should use a image file format better suited for textures (with alpha channel). Like:

  • TGA
  • PNG
  • OpenEXR

Also the various compressed DX texture formats are a good choice for several applications.

My question is :why the index of Image->data is a*3???

Extracting the red channel of a RGB DIB.

Upvotes: 3

Related Questions