1. 程式人生 > >Opengl實現紋理貼圖

Opengl實現紋理貼圖

紋理貼圖的步驟

  1. 建立紋理物件,併為它指定一個紋理
  2. 確定紋理如何應用到每個畫素上
  3. 啟用紋理貼圖功能
  4. 繪製場景,提供紋理座標和幾何圖形坐

Tips:紋理座標必須在RGBA模式下才能使用,在顏色索引模式下是未定義的行為

一、建立紋理物件,併為它指定一個紋理

static GLuint texName;

glGenTextures(1, &texName); //建立1個紋理物件,&texName指向紋理索引

glBindTexture(GL_TEXTURE_2D, texName);//繫結紋理:改變OpenGL狀態,使得後續的紋理操作都對texName指向的2D紋理生效

二、確定紋理如何應用到每個畫素上

1.OpenGL——紋理過濾函式glTexParameteri()      圖象從紋理圖象空間對映到幀緩衝圖象空間(對映需要重新構造紋理影象,這樣就會造成應用到多邊形上的影象失真),這時就可用glTexParmeteri()函式來確定如何把紋理象素對映成畫素.
  • glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  • glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  • glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  • glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
GL_TEXTURE_2D: 操作2D紋理.
GL_TEXTURE_WRAP_S: S方向上的貼圖模式.
GL_CLAMP: 將紋理座標限制在0.0,1.0的範圍之內.如果超出了會如何呢.不會錯誤,只是會邊緣拉伸填充.        
GL_TEXTURE_MAG_FILTER: 放大過濾
GL_LINEAR: 線性過濾, 使用距離當前渲染畫素中心最近的4個紋素加權平均值.
GL_TEXTURE_MIN_FILTER: 縮小過濾

GL_LINEAR_MIPMAP_NEAREST: 使用GL_NEAREST對最接近當前多邊形的解析度的兩個層級貼圖進行取樣,然後用這兩個值進行線性插值.

2.為紋理物件指定一個紋理

glTexImage2D(
GL_TEXTURE_2D,        //target,目標紋理
0,               //解析度級數引數,預設為0
GL_RGBA,               //紋理單元格式
checkImageWidth,      //紋理影象的寬
checkImageHeight,     //紋理影象的高
0,               //紋理影象邊框的寬度,0或1
GL_RGBA,                     //紋理畫素資料的格式
GL_UNSIGNED_BYTE, //畫素資料型別
checkImage              //記憶體中指向紋理影象的指標

);

三、啟用紋理貼圖功能

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清理快取
glEnable(GL_TEXTURE_2D);//啟用紋理貼圖
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//指定紋理貼圖與材質的混合模式
glBindTexture(GL_TEXTURE_2D, texName);//繫結紋理glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

四、繪製場景,提供紋理座標和幾何圖形座標

glBegin(GL_QUADS);
   glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);


   glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
   glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();


glFlush();
glDisable(GL_TEXTURE_2D);