一颂翼、原始圖像數(shù)據(jù)
1.像素包裝
圖像存儲(chǔ)空間 = 圖像的高度 * 圖像寬度 * 每個(gè)像素的字節(jié)數(shù)
二晃洒、函數(shù)
(注意方法名是不一樣的慨灭,i 和f)
// 改變像素存儲(chǔ)方式
void glPixelStorei(GLenum pname,GLint param);
// 恢復(fù)像素存儲(chǔ)方式
void glPixelStoref(GLenum pname,GLfloat param);
- 舉例:
// 參數(shù)1: GL_UNPACK_ALIGNMENT 指定OpenGL 如何從數(shù)據(jù)緩存區(qū)中解包圖像 數(shù)據(jù)
// 參數(shù)2: 表示參數(shù)GL_UNPACK_ALIGNMENT 設(shè)置的值
// GL_UNPACK_ALIGNMENT 指內(nèi)存中每個(gè)像素行起點(diǎn)的排列請(qǐng)求,允許設(shè)置為1 (byte排列)球及、2(排列為偶數(shù)byte的行)氧骤、4(字word排列)、8(行從雙字節(jié) 邊界開始)
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
2.認(rèn)識(shí)函數(shù) 從顏色緩存區(qū)內(nèi)容作為像素圖直接讀取
// 把像素?cái)?shù)據(jù)從內(nèi)存中寫入到幀緩存區(qū)(參數(shù)和下面函數(shù)參數(shù)一樣)
void glDrawPixels (GLsizei width, GLsizei ,
GLenum format, GLenum type,
const GLvoid *pixels);
// 參數(shù)1: x,矩形左下角的窗口坐標(biāo)
// 參數(shù)2: y,矩形左下?的窗口坐標(biāo)
// 參數(shù)3: width,矩形的寬吃引,以像素為單位
// 參數(shù)4: height,矩形的高筹陵,以像素為單位
// 參數(shù)5: format,OpenGL 的像素格式,參考 表6-1
// 參數(shù)6: type,解釋參數(shù)pixels指向的數(shù)據(jù)镊尺,告訴OpenGL 使用緩存區(qū)中的什么 數(shù)據(jù)類型來存儲(chǔ)顏色分量朦佩,像素?cái)?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);
3.認(rèn)識(shí)函數(shù) 載入紋理
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);
// 參數(shù)介紹
- target:
GL_TEXTURE_1D
、GL_TEXTURE_2D
庐氮、GL_TEXTURE_3D
语稠。 - Level: 指定所加載的mip貼圖層次。一般我們都把這個(gè)參數(shù)設(shè)置為0弄砍。
- internalformat: 每個(gè)紋理單元中存儲(chǔ)多少顏色成分仙畦。
- width、height音婶、depth參數(shù): 指加載紋理的寬度议泵、高度、深度桃熄。(這些值以前必須是2的整數(shù)次方先口。這是因?yàn)?OpenGL 舊版本遺留下的一個(gè)要求。當(dāng)然現(xiàn)在已經(jīng)可以支持不是 2 的整數(shù)次方瞳收。但是開發(fā)者們還是習(xí)慣使用以 2 的整數(shù)次方去設(shè)置這些參數(shù)碉京。)
- border參數(shù): 允許為紋理貼圖指定一個(gè)邊界寬度。
- format螟深、type谐宙、data參數(shù): 與 glDrawPixels 函數(shù)對(duì)應(yīng)的參數(shù)相同
4.更新紋理
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);
5.插入替換紋理
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, GL 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);
6.使?顏色緩存區(qū)加載數(shù)據(jù),形成新的紋理使?
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ū)中指定了開始讀取紋理數(shù)據(jù)的位置
// 緩存區(qū)里的數(shù)據(jù),是源緩存區(qū)通過glReadBuffer設(shè)置的
// 注意: 不存在 glCopyTextImage3D 界弧,因?yàn)槲覀儫o法從 2D 顏色緩存區(qū)中獲取體積 數(shù)據(jù)
7.紋理理對(duì)象
// 使用函數(shù)分配紋理對(duì)象
// 指定紋理對(duì)象的數(shù)量 和 指針(指針指向?個(gè)無符號(hào)整形數(shù)組凡蜻,由紋理對(duì)象標(biāo)識(shí)符填充)。
void glGenTextures(GLsizei n,GLuint * textTures);
// 綁定紋理狀態(tài)
// 參數(shù)target: GL_TEXTURE_1D垢箕、GL_TEXTURE_2D划栓、GL_TEXTURE_3D
// 參數(shù)texture: 需要綁定的紋理對(duì)象
void glBindTexture(GLenum target,GLunit texture);
// 刪除綁定紋理對(duì)象
// 紋理對(duì)象 以及 紋理對(duì)象指針(指針指向一個(gè)無符號(hào)整形數(shù)組,由紋理對(duì)象標(biāo)識(shí)符填充)条获。
void glDeleteTextures(GLsizei n,GLuint *textures);
// 測試紋理對(duì)象是否有效
// 如果texture是一個(gè)已經(jīng)分配空間的紋理對(duì)象忠荞,那么這個(gè)函數(shù)會(huì)返回GL_TRUE, 否則會(huì)返回GL_FALSE。
GLboolean glIsTexture(GLuint texture);
8.設(shè)置紋理參數(shù)
參數(shù)1: target, 指定這些參數(shù)將要應(yīng)?在那個(gè)紋理模式上,?如GL_TEXTURE_1D委煤、GL_TEXTURE_2D堂油、GL_TEXTURE_3D。
參數(shù)2: pname, 指定需要設(shè)置那個(gè)紋理參數(shù)
參數(shù)3: param, 設(shè)定特定的紋理參數(shù)的值
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);
(2) 過濾方式比較 和 紋理過濾比較
// 紋理縮小時(shí),使?鄰近過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
// 紋理放大時(shí),使?線性過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_HEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_HEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
9.設(shè)置環(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,針對(duì)s,t,r坐標(biāo)
參數(shù)3: GL_REPEAT迫靖、GL_CLAMP、GL_CLAMP_TO_EDGE计维、GL_CLAMP_TO_BORDER
(1)GL_REPEAT: OpenGL 在紋理坐標(biāo)超過1.0的方向上對(duì)紋理進(jìn)?重復(fù);
(2)GL_CLAMP: 所需的紋理單元取?紋理邊界或TEXTURE_BORDER_COLOR.
(3)GL_CLAMP_TO_EDGE 環(huán)繞模式強(qiáng)制對(duì)范圍之外的紋理坐標(biāo)沿著合法的紋理單元的最后一行或者最后一列來進(jìn)行采樣。
(4)GL_CLAMP_TO_BORDER: 在紋理坐標(biāo)在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);
10.設(shè)置 Mip 貼圖
// 設(shè)置 mip 貼圖基層 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);
// 設(shè)置 mip 貼圖最大層 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);
11.判斷壓縮 與 選擇壓縮方式
GLint comFlag;
// 判斷紋理是否被成功壓縮 glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);
// 根據(jù)選擇的壓縮紋理格式实抡,選擇最快欠母、最優(yōu)、?行選擇的算法方式選擇壓縮格式吆寨。 glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST); glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST); glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);
12.加載壓縮紋理
target:
GL_TEXTURE_1D
赏淌、GL_TEXTURE_2D
、GL_TEXTURE_3D
啄清。Level: 指定所加載的mip貼圖層次六水。一般我們都把這個(gè)參數(shù)設(shè)置為0。
internalformat: 每個(gè)紋理單元中存儲(chǔ)多少顏色成分辣卒。
width掷贾、height、depth參數(shù): 指加載紋理的寬度荣茫、?度想帅、深度。
(注意! 這些值以前必須是2的整數(shù)次方啡莉。這是因?yàn)榕f版本上遺留下的?個(gè)要求港准。當(dāng)然現(xiàn)在已經(jīng)可以?持不是2的整數(shù)次方。但是開發(fā)者們還是習(xí)慣使用以2的整數(shù)次方去寫參數(shù)咧欣。)
border參數(shù): 允許為紋理貼圖指定一個(gè)邊界寬度浅缸。
format、type魄咕、data參數(shù): 與 glDrawPixels 函數(shù)的參數(shù)相同
void glCompressedTexImage1D(GLenum target,
GLint level,GLenum internalFormat,
GLsizei width,GLint border,
GLsizei imageSize,void *data);
void glCompressedTexImage2D(GLenum target,
GLint level,GLenum internalFormat,
GLsizei width,GLint heigth,GLint border,
GLsizei imageSize,void *data);
void glCompressedTexImage3D(GLenum target,
GLint level,GLenum internalFormat,
GLsizei width,GLsizei heigth,GLsizei depth,
GLint border,GLsizei imageSize,void *data);
(2)glGetTexLevelParameter 函數(shù)提取的壓縮紋理格式
// 如果紋理被壓縮疗杉,返回1,否則返回0
GL_TEXTURE_COMPRESSED
// 壓縮后的紋理的?小(以字節(jié)為單位)
GL_TEXTURE_COMPRESSED_IMAGE_SIZE
// 所使用的壓縮格式
GL_TEXTURE_INTERNAL_FORMAT
// 受支持的壓縮紋理格式數(shù)量
GL_NUM_COMPRESSED_TEXTURE_FORMATS
// 一個(gè)包含了?些常量值的數(shù)組,每個(gè)常量值對(duì)應(yīng)于一種受支持的壓縮紋理格式
GL_COMPRESSED_TEXTURE_FORMATS
// 壓縮紋理提示的值(GL/NICEST/GL_FASTEST)
GL_TEXTURE_COMPRESSION_HINT
(3)GL_EXT_texture_compression_s3tc 壓縮格式
// RGB 數(shù)據(jù)被壓縮烟具,alpha值始終是1.0
GL_COMPRESSED_RGB_S3TC_DXT1
// RGBA 數(shù)據(jù)被壓縮梢什,alpha值返回 1.0 或者 0.0
GL_COMPRESSED_RGBA_S3TC_DXT1
// RGB 值被壓縮,alpha 值用4位存儲(chǔ)
GL_COMPRESSED_RGAB_S3TC_DXT3
// RGB 數(shù)據(jù)被壓縮朝聋,alpha 值是一些8位值的加權(quán)平均值
GL_COMPRESSED_RGBA_SETC_DXT5