2012-05-09 113 views
0

我正在学习OpenGL NeHe制作。当我阅读第22课Bump-Mapping,多纹理时,我遇到了一个问题。使用OpenGL中的auxDIBImageLoad将纹理加载为纹理

当我加载徽标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->数据的索引是* 3?

有人能为我解读吗?

回答

2

我学习的OpenGL讷河Production.When我读lesson22凹凸贴图

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

而不是BMP你应该使用更适合纹理(与alpha通道)的图像文件格式。像:

  • TGA
  • PNG
  • 的OpenEXR

而且各种压缩DX纹理格式是几个应用的理想选择。

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

提取RGB DIB的红色通道。

+0

:你能推荐一些好的书籍或材料研究的OpenGL非常感谢? – XiaJun

+1

我可以推荐这个:http://www.arcsynthesis.org/gltut/。如果它是由Nicol Bolas生产的,我无法解决! – Robinson

+0

http://arcsynthesis.org/gltut是一个很好的教程,但仍在工作中。 http://www.lighthouse3d.com/tutorials/具有非常好的着色器教程资料。当然http://www.opengl.org/wiki/Getting_Started#Tutorials_and_How_To_Guides – datenwolf

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]; 
+0

我从灰色bmp得到alpha值:它的R,G,B值是等价的,对吧? – XiaJun

+0

灰度bmp中每个像素的3个字节都是相同的,但我不能肯定地说没有看到数据本身。 – luke