1.從TGA?文件中讀取像素圖
GLbyte *gltReadTGABits(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat);
參數1: 紋理文件名稱
參數2: ?件寬度地址
參數3:?件高度地址
參數4:文件組件地址
參數5:?件格式地址-Open GL中顏色存儲格式
返回值:pBits,指向圖像數據的指針
2.紋理載入函數 1D 2D 3D紋理載入 常用2D紋理載入
void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, void *data);
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,void * data);
void glTexImage3D(GLenum target,GLint level,GLint internalformat,GLSizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,void *data);
- target:
GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。 - Level:指定所加載的mip貼圖層次。一般我們都把這個參數設置為0。
- internalformat:每個紋理單元中存儲多少顏色成分。
- width、height、depth參數:指加載紋理的寬度、?度、深度。==注意!==這些值必須是 2的整數次?方。(這是因為OpenGL 舊版本上的遺留留下的?一個要求。當然現(xiàn)在已經可以?支持不不是 2的整數次?方。但是開發(fā)者們還是習慣使?用以2的整數次?方去設置這些參數。)
- border參數:允許為紋理貼圖指定?個邊界寬度。
- format 參數:Open GL中顏色存儲格式
*type 參數:使用什么數據類型存儲顏色分量
*data參數: 返回的圖像數據的指針
3. 更新紋理
void glTexSubImage1D(GLenum target,GLint level,GLint xOffset,GLsizei width,GLenum
format,GLenum type,const GLvoid *data);
void glTexSubImage2D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLsizei
width,GLsizei height,GLenum format,GLenum type,const GLvoid *data);
void glTexSubImage3D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLint
zOffset,GLsizei width,GLsizei height,GLsizei depth,Glenum type,const GLvoid * data);
參數含義同2,用得不多
4.插入替換紋理
void glCopyTexSubImage1D(GLenum target,GLint level,GLint xoffset,GLint x,GLint y,GLsizei
width);
void glCopyTexSubImage2D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint x,GLi
y,GLsizei width,GLsizei height);
void glCopyTexSubImage3D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint
zOffset,GLint x,GLint y,GLsizei width,GLsizei height);
參數含義同2,用得不多
5.使用顏?緩存區(qū)加載數據,形成新的紋理使?
void glCopyTexImage1D(GLenum target,GLint level,GLenum
internalformt,GLint x,GLint y,GLsizei width,GLint border);
void glCopyTexImage2D(GLenum target,GLint level,GLenum
internalformt,GLint x,GLint y,GLsizei width,GLsizei
height,GLint border);
x,y 在顏?緩存區(qū)中指定了開始讀取紋理數據的位置; 緩存區(qū)?的數據,是源緩存區(qū)通過glReadBuffer設置的。
注意:不存在glCopyTextImage3D ,因為我們?法從2D 顏色緩存區(qū)中獲取體積 數據。
6.紋理對象
//使?函數分配紋理對象
//指定紋理對象的數量 和 指針(指針指向?個無符號整形數組,由紋理對象標識符填充)。
void glGenTextures(GLsizei n,GLuint * textTures);
//綁定紋理理狀態(tài)
//參數target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
//參數texture:需要綁定的紋理對象
void glBindTexture(GLenum target,GLunit texture);
//刪除綁定紋理理對象
//紋理對象 以及 紋理對象指針(指針指向?個無符號整形數組,由紋理對象標識符填充)。
void glDeleteTextures(GLsizei n,GLuint *textures);
//測試紋理理對象是否有效
//如果texture是?個已經分配空間的紋理對象,那么這個函數會返回GL_TRUE,否則會返回GL_FALSE。
GLboolean glIsTexture(GLuint texture);
7.設置紋理參數-過濾方式
glTexParameterf(GLenum target,GLenum pname,GLFloat param);
glTexParameteri(GLenum target,GLenum pname,GLint param);
glTexParameterfv(GLenum target,GLenum pname,GLFloat *param);
glTexParameteriv(GLenum target,GLenum pname,GLint *param);
參數1:target,指定這些參數將要應用在那個紋理模式上,比如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
參數2:pname,指定需要設置那個紋理理參數
參數3:param,設定特定的紋理理參數的值
鄰近過濾(GL_NEAREST) 線性過濾(GL_LINEAR)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST) 紋理理縮?小時,使?用鄰近過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) 紋理理放?大時,使?用線性過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);


參數1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
參數2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,針對s,t,r坐標
s, t, r, q <-> x, y, z, w
參數3:GL_REPEAT、GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER
GL_REPEAT:OpenGL 在紋理坐標超過1.0的?向上對紋理進?重復;
GL_CLAMP:所需的紋理單元取自紋理邊界或TEXTURE_BORDER_COLOR. GL_CLAMP_TO_EDGE:環(huán)繞模式強制對范圍之外的紋理坐標沿著合法的紋理單元的最后??或者最后?列來進?采樣。
GL_CLAMP_TO_BORDER:在紋理理坐標在0.0到1.0范圍之外的只使用邊界紋理單元。邊界紋理理單元是作為圍繞基本圖像的額外的?和列列,并與基本紋理圖像?一起加載的。 glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE);
8.紋理坐標



紋理坐標和頂點坐標的對應方式是,上下左右4個面都可以朝上
9. Mip貼圖(多級漸遠紋理)
什么是Mip貼圖
Mip貼圖是一種功能強大的紋理技巧。它可以提高渲染性能同時可以改善場景的顯示質量。
??????????????????????????????????????????????????????????????????????想象一下,假設我們有一個包含上千物體的大房間,每個物體上都有相同的紋理,有些物體會很遠,但其紋理會擁有與近處物體同樣高的分辨率。由于遠處的物體可能只產生很少的片段,OpenGL從高分辨率紋理中為這些片段獲取正確的顏色值就很困難,因為它需要對一個跨過紋理很大部分的片段只拾取一個紋理顏色。在小物體上這會產生不真實的感覺,更不用說對它們使用高分辨率紋理浪費內存的問題了。
OpenGL使用一種叫做多級漸遠紋理(Mipmap)的概念來解決這個問題,它簡單來說就算一些列的紋理圖像,后一個紋理圖像是前一個的二分之一。多級漸遠紋理背后的理念很簡單:距離觀察者超過一定的閾值,OpenGL會使用不同的多級漸遠紋理,即最合適物體的距離的那個。由于距離遠,解析度不高也不會被用戶注意到,同時,多級漸遠紋理另一加分之處是它的性能非常好。
手工為每個紋理圖像創(chuàng)建一系列多級漸遠紋理很麻煩,幸好OpenGL有一個glGenerateMipmaps函數,在創(chuàng)建完一個紋理后調用它,就會承擔接下來的所有工作了。

*什么時候生成Mip貼圖?
只有minFilter等于以下四種模式,才可以生成Mip貼圖
- GL_NEAREST_MIPMAP_NEAREST 具有非常好的性能,并且閃爍現(xiàn)象非常弱
- GL_NEAREST_MIPMAP_LINEAR 過濾器在Mip層之間執(zhí)行了一些額外的插值,以消除他們之間的過濾痕跡。
- GL_LINEAR_MIPMAP_NEAREST 常常用于對游戲進行加上,它使用了高質量的線性過濾器
- GL_LINEAR_MIPMAP_LINEAR 三線性Mip貼圖,紋理過濾的黃金準則,具有最高的精度
Mip貼圖可以解決的常見問題
1.閃爍問題,當屏幕上被渲染物體的表面與它所應用的紋理圖像相比顯得非常小時,就會出現(xiàn)閃爍效果。
2.性能問題,加載更大的紋理內存并對它們進行過濾處理,但屏幕上實際只是顯示的很少的一部分片段,紋理越大,性能影響越明顯。
這2種問題,最簡單的解決犯法就是使用更小的紋理圖像,根本解決方案就是使用Mip貼圖。
10. 紋理渲染流程?????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????
//分配紋理對象
參數1:紋理對象個數,
參數2:紋理對象指針
glGenTextures(1, &textureID);
//綁定紋理狀態(tài)
參數1:紋理狀態(tài)2D
參數2:紋理對象
glBindTexture(GL_TEXTURE_2D, textureID);
GLbyte *pBits;
int nWidth, nHeight, nComponents;
GLenum eFormat;
//1、讀紋理位,讀取像素
//參數1:紋理文件名稱
//參數2:文件寬度地址
//參數3:文件高度地址
//參數4:文件組件地址
//參數5:文件格式地址
//返回值:pBits,指向圖像數據的指針
pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
if(pBits == NULL)
return false;
//2、設置紋理參數
//參數1:紋理維度
//參數2:為S/T坐標設置模式
//參數3:wrapMode,環(huán)繞模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
//參數1:紋理維度
//參數2:線性過濾
//參數3:wrapMode,環(huán)繞模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
//設置各向異性過濾
GLfloat fLargest;
//獲取各向異性過濾的最大數量
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest);
//設置紋理參數(各向異性采樣)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
//設置各向同性過濾,數量為1.0表示(各向同性采樣)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
//3.載入紋理
//參數1:紋理維度
//參數2:mip貼圖層次
//參數3:紋理單元存儲的顏色成分(從讀取像素圖是獲得)
//參數4:加載紋理寬
//參數5:加載紋理高
//參數6:加載紋理的深度
//參數7:像素數據的數據類型(GL_UNSIGNED_BYTE,每個顏色分量都是一個8位無符號整數)
//參數8:指向紋理圖像數據的指針
glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0,
eFormat, GL_UNSIGNED_BYTE, pBits);
//使用完畢釋放pBits
free(pBits);
//只有minFilter 等于以下四種模式,才可以生成Mip貼圖
//GL_NEAREST_MIPMAP_NEAREST具有非常好的性能,并且閃爍現(xiàn)象非常弱
//GL_LINEAR_MIPMAP_NEAREST常常用于對游戲進行加速,它使用了高質量的線性過濾器
//GL_LINEAR_MIPMAP_LINEAR 和GL_NEAREST_MIPMAP_LINEAR 過濾器在Mip層之間執(zhí)行了一些額外的插值,以消除他們之間的過濾痕跡。
//GL_LINEAR_MIPMAP_LINEAR 三線性Mip貼圖。紋理過濾的黃金準則,具有最高的精度。
if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||
minFilter == GL_LINEAR_MIPMAP_NEAREST ||
minFilter == GL_NEAREST_MIPMAP_LINEAR ||
minFilter == GL_NEAREST_MIPMAP_NEAREST)
//4.紋理生成所有的Mip層
//參數:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
glGenerateMipmap(GL_TEXTURE_2D);