OpenGL-基礎(chǔ)紋理

一、原始圖像數(shù)據(jù)

1.像素包裝

圖像存儲空間 = 圖像的高度 * 圖像寬度 * 每個像素的字節(jié)數(shù)

二、函數(shù)

(注意方法名是不一樣的,i 和f)

// 改變像素存儲方式
void glPixelStorei(GLenum pname,GLint param);

// 恢復(fù)像素存儲方式
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)存中每個像素行起點的排列請求,允許設(shè)置為1 (byte排列)、2(排列為偶數(shù)byte的行)、4(字word排列)、8(行從雙字節(jié) 邊界開始)

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

2.認(rèn)識函數(shù) 從顏色緩存區(qū)內(nè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ù)類型來存儲顏色分量,像素數(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);

表6-1 OpenGL 像素格式

3.認(rèn)識函數(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貼圖層次。一般我們都把這個參數(shù)設(shè)置為0。
  • internalformat: 每個紋理單元中存儲多少顏色成分。
  • width、height、depth參數(shù): 指加載紋理的寬度、高度、深度。(這些值以前必須是2的整數(shù)次方。這是因為 OpenGL 舊版本遺留下的一個要求。當(dāng)然現(xiàn)在已經(jīng)可以支持不是 2 的整數(shù)次方。但是開發(fā)者們還是習(xí)慣使用以 2 的整數(shù)次方去設(shè)置這些參數(shù)。)
  • border參數(shù): 允許為紋理貼圖指定一個邊界寬度。
  • format、type、data參數(shù): 與 glDrawPixels 函數(shù)對應(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 ,因為我們無法從 2D 顏色緩存區(qū)中獲取體積 數(shù)據(jù)

7.紋理理對象

// 使用函數(shù)分配紋理對象
// 指定紋理對象的數(shù)量 和 指針(指針指向?個無符號整形數(shù)組,由紋理對象標(biāo)識符填充)。

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ù)組,由紋理對象標(biāo)識符填充)。

void glDeleteTextures(GLsizei n,GLuint *textures);

// 測試紋理對象是否有效
// 如果texture是一個已經(jīng)分配空間的紋理對象,那么這個函數(shù)會返回GL_TRUE, 否則會返回GL_FALSE。

GLboolean glIsTexture(GLuint texture);

8.設(shè)置紋理參數(shù)

  • 參數(shù)1: target, 指定這些參數(shù)將要應(yīng)?在那個紋理模式上,?如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。

  • 參數(shù)2: pname, 指定需要設(shè)置那個紋理參數(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) 過濾方式比較 和 紋理過濾比較
2種紋理過濾方式?較

// 紋理縮小時,使?鄰近過濾
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_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,針對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的方向上對紋理進(jìn)?重復(fù);
    (2)GL_CLAMP: 所需的紋理單元取?紋理邊界或TEXTURE_BORDER_COLOR.
    (3)GL_CLAMP_TO_EDGE 環(huán)繞模式強(qiáng)制對范圍之外的紋理坐標(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_1DGL_TEXTURE_2DGL_TEXTURE_3D。

  • Level: 指定所加載的mip貼圖層次。一般我們都把這個參數(shù)設(shè)置為0。

  • internalformat: 每個紋理單元中存儲多少顏色成分。

  • width、height、depth參數(shù): 指加載紋理的寬度、?度、深度。
    (注意! 這些值以前必須是2的整數(shù)次方。這是因為舊版本上遺留下的?個要求。當(dāng)然現(xiàn)在已經(jīng)可以?持不是2的整數(shù)次方。但是開發(fā)者們還是習(xí)慣使用以2的整數(shù)次方去寫參數(shù)。)

  • border參數(shù): 允許為紋理貼圖指定一個邊界寬度。

  • 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

// 一個包含了?些常量值的數(shù)組,每個常量值對應(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位存儲
GL_COMPRESSED_RGAB_S3TC_DXT3

// RGB 數(shù)據(jù)被壓縮,alpha 值是一些8位值的加權(quán)平均值
GL_COMPRESSED_RGBA_SETC_DXT5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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