紋理API

紋理Api簡介

存儲方式

//改變像素存儲?方式
void glPixelStorei(GLenum pname,GLint param);
//恢復像素存儲方式
void glPixelStoref(GLenum pname,GLfloat param);
//參數(shù)
//參數(shù)1:GL_UNPACK_ALIGNMENT 指定OpenGL 如何從數(shù)據(jù)緩存區(qū)中解包圖像 數(shù)據(jù)
//參數(shù)2:表示參數(shù)GL_UNPACK_ALIGNMENT 設置的值
//GL_UNPACK_ALIGNMENT 指內(nèi)存中每個像素行起點的排列請求,允許設置為1 (byte排列)、2(排列為偶數(shù)byte的行)、4(字word排列)、8(?從雙字節(jié) 邊界開始)
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

讀取存儲

//參數(shù)1:x,矩形左下角的窗口坐標
//參數(shù)2:y,矩形左下角的窗口坐標
//參數(shù)3:width,矩形的寬,以像素為單位
//參數(shù)4:height,矩形的?,以像素為單位
//參數(shù)5:format,OpenGL 的像素格式,格式如下圖:
//參數(shù)6:type,解釋參數(shù)pixels指向的數(shù)據(jù),告訴OpenGL 使用緩存區(qū)中的什么 數(shù)據(jù)類型來存儲顏色分量,像素數(shù)據(jù)的數(shù)據(jù)類型,數(shù)據(jù)類型如下圖:
//參數(shù)7:pixels,指向圖形數(shù)據(jù)的指針
void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei
height, GLenum format, GLenum type,const void * pixels);

glReadBuffer(mode);—> 指定讀取的緩存
glWriteBuffer(mode);—> 指定寫?入的緩存
OpenGL的像素格式.png

OpenGL像素數(shù)據(jù)的數(shù)據(jù)類型.png

載入紋理

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貼圖層次。?一般我們都把這個參數(shù)設置為0。
* internalformat:每個紋理理單元中存儲多少顏色成分。
* width、height、depth參數(shù):指加載紋理的寬度、高度、深度。==注意!==這些值必須是 2的整數(shù)次方。(這是因為OpenGL 舊版本上的遺留下的一個要求。當然現(xiàn)在已經(jīng)可以支持不是 2的整數(shù)次方。但是開發(fā)者們還是習慣使用以2的整數(shù)次?去設置這些參數(shù)。)
* border參數(shù):允許為紋理貼圖指定?一個邊界寬度。
* format、type、data參數(shù):與我們在講glDrawPixels 函數(shù)對于的參數(shù)相同

載入紋理比較常用的是glTexImage2D

更新紋理、插入替換紋理

//更新紋理
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);
//插入替換紋理
void glCopyTexSubImage1D(GLenum target,GLint level,GLint xoffset,GLint x,GLint y,GLsize
width);
void glCopyTexSubImage2D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint x,
     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);

綁定紋理(記?。?/h2>
//使用函數(shù)分配紋理對象
//指定紋理對象的數(shù)量 和 指針(指針指向一個?無符號整形數(shù)組,由紋理對象標識符填充)。 
void glGenTextures(GLsizei n,GLuint * textTures);
//綁定紋理狀態(tài) //參數(shù)target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
//參數(shù)texture:需要綁定的紋理對象
void glBindTexture(GLenum target,GLunit texture);

刪除綁定紋理對象

//刪除綁定紋理對象
//紋理對象 以及 紋理對象指針(指針指向?個?符號整形數(shù)組,由紋理對象標識符填充)。
void glDeleteTextures(GLsizei n,GLuint *textures);
//測試紋理對象是否有效
//如果texture是一個已經(jīng)分配空間的紋理對象,那么這個函數(shù)會返回GL_TRUE,否則會返回GL_FALSE。 
GLboolean glIsTexture(GLuint texture);

設置紋理參數(shù)(記?。?/h2>
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);

參數(shù)1:target,指定這些參數(shù)將要應用在那個紋理模式上,比如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
參數(shù)2:pname,指定需要設置那個紋理參數(shù)
參數(shù)3:param,設定特定的紋理參數(shù)的值

設置過濾方式

有臨近過濾和線性過濾兩種


鄰近過濾.png
線性過濾.png

函數(shù)設置

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);

環(huán)繞?式

環(huán)繞方式 描述
GL_REPEAT 對紋理的默認行為。重復紋理圖像
GL_MIRRORED_REPEAT 和GL_REPEAT一樣但是重復的圖像是鏡像的
GL_CLAMP_TO_EDGE 紋理坐標會被約束到0到1之間超出部分會重復紋理坐標的邊緣,產(chǎn)生一種邊緣被拉伸的效果
GL_CLAMP_TO_BORDER 超出部分為用戶指定的顏色
環(huán)繞方式.png
//設置環(huán)繞方式
參數(shù)1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D 
參數(shù)2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,針對s,t,r坐標 
參數(shù)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);
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容