0

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 ?

4

2 回答 2

3

我正在学习 OpenGL NeHe Production。当我阅读第 22 课时凹凸贴图

为什么?NeHe 教程已经非常过时了,其中概述的凹凸贴图技术也完全过时了。它已被基于着色器的法线贴图取代超过 13 年(直到 2003 年使用纹理组合器代替着色器)。

此外,您应该使用更适合纹理的图像文件格式(带 alpha 通道),而不是 BMP。喜欢:

  • TGA
  • PNG
  • 开放式EXR

此外,各种压缩的 DX 纹理格式也是多种应用程序的不错选择。

我的问题是:为什么 Image->data 的索引是 a*3 ???

提取 RGB DIB 的红色通道。

于 2012-05-09T12:20:58.407 回答
0

这是通道偏移量。RGB 数据存储为三个连续字节。这里'a'代表哪个像素(3字节组,一个用于R,一个用于G,一个用于B)。

将 a*3 视为指向 3 个字节数组的指针:

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

char red   = myPixel[0];
char green = myPixel[1];
char blue  = myPixel[2];
于 2012-05-09T12:24:08.450 回答