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

在OpenGL中使用auxDIBImageLoad将bmp文件加载为纹理,opengl,graphics,3d,Opengl,Graphics,3d,我正在学习OpenGL NeHe制作。当我读第22课凹凸贴图、多重纹理时,我遇到了一个问题 加载徽标bmp文件时,需要加载两个bmp文件:一个存储颜色信息,另一个存储alpha信息。 以下是两个bmp文件: OpenGL_Alpha.bmp: 和OpenGL.bmp: 代码如下: if (Image=auxDIBImageLoad("Data/OpenGL_ALPHA.bmp")) { alpha=new char[4*Image->sizeX*Image-&g

我正在学习OpenGL NeHe制作。当我读第22课凹凸贴图、多重纹理时,我遇到了一个问题

加载徽标bmp文件时,需要加载两个bmp文件:一个存储颜色信息,另一个存储alpha信息。 以下是两个bmp文件: OpenGL_Alpha.bmp:

和OpenGL.bmp:

代码如下:

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;
if(Image=auxDIBImageLoad(“Data/OpenGL_ALPHA.bmp”)){
alpha=新字符[4*图像->sizeX*图像->sizeY];
对于(int a=0;asizeX*Image->sizeY;a++)
alpha[4*a+3]=图像->数据[a*3];/???????
如果(!(Image=auxDIBImageLoad(“Data/OpenGL.bmp”))状态=false;
对于(a=0;asizeX*Image->sizeY;a++){
alpha[4*a]=图像->数据[a*3];/??????????
alpha[4*a+1]=图像->数据[a*3+1];
alpha[4*a+2]=图像->数据[a*3+2];
}
glGenTextures(1和glLogo);
glBindTexture(GL_TEXTURE_2D,glLogo);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA8,图像->尺寸,图像->尺寸,0,GL_RGBA,GL_无符号字节,alpha);
删除alpha;
}

我的问题是:为什么图像->数据的索引是*3

有人能帮我翻译吗

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

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

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

  • 热重分析
  • 巴布亚新几内亚
  • OpenEXR
此外,各种压缩DX纹理格式也是多种应用程序的良好选择

我的问题是:为什么图像->数据的索引是*3

提取RGB DIB的红色通道

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

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

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

  • 热重分析
  • 巴布亚新几内亚
  • OpenEXR
此外,各种压缩DX纹理格式也是多种应用程序的良好选择

我的问题是:为什么图像->数据的索引是*3


提取RGB DIB的红色通道。

这是通道偏移量。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];

这是通道偏移量。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];

:你能推荐一些学习OpenGL的好书或材料吗?非常感谢。我可以推荐以下内容:。我永远也搞不清楚它是不是由尼科尔·博拉斯制作的!是一个优秀的教程,但仍在进行中。有非常好的着色器教程材质。当然:你能推荐一些学习OpenGL的好书或材料吗?非常感谢。我可以推荐以下内容:。我永远也搞不清楚它是不是由尼科尔·博拉斯制作的!是一个优秀的教程,但仍在进行中。有非常好的着色器教程材质。当然,我从灰色的bmp中得到了alpha值:它的R、G、B值是相等的,对吗?灰度bmp中每像素3个字节都是相同的,但我不能在没有看到数据本身的情况下确定。我从灰色bmp中得到alpha值:它的R、G、B值是相等的,对吗?灰度bmp中每像素3个字节都是相同的,这是有道理的,但是如果不看到数据本身,我不能肯定。