2012-05-09 108 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