使用OpenGL中的auxDIBImageLoad将bmp文件作为纹理加载

时间:2012-05-09 12:12:21

标签: opengl graphics 3d

我正在学习OpenGL NeHe Production。当我阅读第22节凹凸贴图,多纹理时,我遇到了问题。

当我加载logo bmp文件时,我需要加载两个bmp文件:一个存储颜色信息,另一个存储alpha信息。 这是两个bmp文件: OpenGL_Alpha.bmp: enter image description here

和OpenGL.bmp: enter image description here

以下是代码:

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;

}

我的问题是:为什么Image-&gt;数据的索引是* 3 ???

有人能解释一下吗?

2 个答案:

答案 0 :(得分:2)

  

我正在学习OpenGL NeHe Production。当我读到第22节凹凸贴图

为什么呢? NeHe教程非常过时,那里概述的凹凸贴图技术完全过时了。它已被基于着色器的法线贴图取代了超过13年(直到使用2003纹理合成器而不是着色器)。

也可以使用更适合纹理的图像文件格式(使用Alpha通道)代替BMP。像:

  • TGA
  • PNG
  • 的OpenEXR

各种压缩DX纹理格式也是多种应用的理想选择。

  

我的问题是:为什么Image-&gt;数据的索引是* 3 ???

提取RGB DIB的红色通道。

答案 1 :(得分:0)

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

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

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

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