《紋理貼圖》
標籤(空格分隔): OpenGL編程指南第七版
由於時間關係,這本書後面章節不再更新。
9.1 概述和示例
9.1.1 紋理貼圖的步驟
9.2 指定紋理
void glTextImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* texels);
紋理圖像的寬度和高度上的紋理單元的數量必須是2的整數次方倍。如果源圖像不滿足這個要求,可以用OpenGL工具庫函數gluScaleImage()更改紋理圖像大小。
int gluScaleImage(GLenum format, GLint widthin, GLint heightin, GLenum typein, const void* datain, GLint widthout, GLint heightout, GLenum typeout, void* dataout);
void glCopyTexImage2D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);從幀緩衝區中讀取一塊矩形像素,並且把它作爲新紋理的紋理單元。
9.2.1 紋理代理
OpenGL提供一種特殊的紋理目標,稱爲紋理代理,可用於判斷當前的OpenGL實現在某種特定的紋理大小下是否支持某種特定的紋理格式。
可以用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ……)查詢紋理圖像的最大寬度和最大高度。
創建紋理代理:
void glGetTexLevelParameter{if}v(GLenum target, GLint level, GLenum, pname, TYPE* params);
如:
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA8, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, & width);
9.2.2 替換紋理圖像的全部或一部分
void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* texels);
void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);從緩衝區讀取一塊像素句型,並替換現有紋理數組的一部分。
9.2.3 一維紋理
void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid* texels);高默認爲1
void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid* texels);
void glCopyTexImage1D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLint border);
void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width);
9.2.4 三維紋理
void glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* texels)
void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* texels);
void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
9.2.5 紋理數組
紋理數組允許把一個集合組織起來,所有的紋理都具有相同的大小,都位於更高維度的一個紋理之中(例如,二維紋理的數組是三維紋理的一部分)。
9.2.6 壓縮紋理圖像
在加載時壓縮紋理圖像
加載經過壓縮的紋理圖像
glCompressedTexImage1D(Glenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid* texels);
glCompressedTexImage2D(Glenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* texels);
glCompressedTexImage3D(Glenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* texels);
經過壓縮的紋理替換已經加載的紋理的全部或一部分
glCompressedTexSubImage1D(Glenum target, GLint level, GLint xoffset, GLsizei width, GLsizei format, GLsizei imageSize, const GLvoid* texels);
glCompressedTexSubImage2D(Glenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsize height, GLsizei imageSize, const GLvoid* texels);
glCompressedTexSubImage3D(Glenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsize height, GLsizei depth, GLsizei imageSize, const GLvoid* texels);
9.2.8 mipmap:多重細節層
五個大小不同,顏色不同的紋理組成mipmap效果
在實際應用程序中構建Mipmap
int glGenerateMipmap(GLenum target);
計算Mipmap層
Mipmap層的細節控制
9.3 過濾
屏幕上一個像素可以對應一個很廣的範圍,可能是一個紋理單元的一小部分(放大),也可能是多個紋理單元(縮小)。
9.4 紋理對象
9.4.1 命名紋理對象
void glGenTextures(GLsizei n, GLuint* textureNames);
9.4.2 創建和使用紋理對象
void glBindTexture(GLenum target, GLuint textureName);
9.4.3 清楚紋理對象
void glDeleteTexture(GLsizei n, const GLuint* textureNames);
9.4.4 常駐紋理工作集
如果想要知道多個紋理的紋理常駐狀態,可以使用glAreTextureResident()函數。
GLboolean glAreTextureResident(GLsizei n, const GLuint* textureNames, GLboolean* residences);
紋理常駐策略
void glPrioritizeTextures(GLsizei n, const GLuint* textureNames, const GLclampf* priorities);
9.5 紋理函數
把紋理圖像的顏色與物體表面的原先顏色進行組合。
void glTexEnv{if}(GLenum target, GLenum pname, TYPE param);
void glTexEnv{if}v(GLenum target, GLenum pname, TYPE* param);
9.6 分配紋理座標
頂點之間的紋理座標也會進行插值均和 紋理座標(s,t,r,q)對應頂點座標(x,y,z,w)
9.7 紋理座標自動生成
9.8 多重紋理