《OpelGL編程指南第七版》第九章:紋理貼圖(筆記)

《紋理貼圖》

標籤(空格分隔): OpenGL編程指南第七版


由於時間關係,這本書後面章節不再更新。

9.1 概述和示例

9.1.1 紋理貼圖的步驟

image_1c3ovh8e8ect1m001nup1g5910l19.png-49.4kB

9.2 指定紋理

void glTextImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* texels);
image_1c3p0id0d1djs1hieh611n3211m.png-32kB
image_1c3p0ooee12svv2d1ovd1o071ch313.png-696.1kB
image_1c3p0phscuq01m1gr7lk9e14tu1g.png-122.9kB
image_1c3p0ptrv1nqeq06150311v71vj71t.png-256.7kB
image_1c3p0qj9igr7nbv1u8s4he1a2d2a.png-458.2kB
image_1c3p0rc9219cl1uvq5b718ckcf82n.png-172.2kB

紋理圖像的寬度和高度上的紋理單元的數量必須是2的整數次方倍。如果源圖像不滿足這個要求,可以用OpenGL工具庫函數gluScaleImage()更改紋理圖像大小。
int gluScaleImage(GLenum format, GLint widthin, GLint heightin, GLenum typein, const void* datain, GLint widthout, GLint heightout, GLenum typeout, void* dataout);
image_1c3p18v9pm1co4vn8217bg19h341.png-133.1kB
image_1c3p18dms1g6hsi41pi31a56o8r3k.png-51.8kB

void glCopyTexImage2D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);從幀緩衝區中讀取一塊矩形像素,並且把它作爲新紋理的紋理單元。
image_1c3p1g4vl42n1r2ti71nh268n4e.png-379.9kB

9.2.1 紋理代理

OpenGL提供一種特殊的紋理目標,稱爲紋理代理,可用於判斷當前的OpenGL實現在某種特定的紋理大小下是否支持某種特定的紋理格式。
可以用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ……)查詢紋理圖像的最大寬度和最大高度。
image_1c3p1t5in77q1mbg5goih1b5f4r.png-97.3kB

創建紋理代理:image_1c3p1ujb8orh1pfeggcbmogns58.png-128.1kB

image_1c3p1vlhfn7lpr01h6io8q2qi5l.png-64.6kB
void glGetTexLevelParameter{if}v(GLenum target, GLint level, GLenum, pname, TYPE* params);
image_1c3p21obepo1gq537m2rd1ej762.png-323.9kB
如:
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);
image_1c3p2odo29tjb5vvnu4bj52q7f.png-295.8kB

void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);從緩衝區讀取一塊像素句型,並替換現有紋理數組的一部分。
image_1c3p36v3diesrof1pm41nm41lh27s.png-273.4kB

9.2.3 一維紋理

void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid* texels);高默認爲1
image_1c3p3d8c72dkcf9c783i9qf89.png-131.4kB

void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid* texels);
image_1c3p3fdavg46qqh16nr17edj978m.png-212kB

void glCopyTexImage1D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLint border);
image_1c3p3jrhhocv1m7vm6riud1e479.png-229.7kB

void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width);
image_1c3p3k8ft1r64177mfa5n6kcj1m.png-198.3kB

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)
image_1c3p3q35m1s9k9kn89thq21cs013.png-204.9kB

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);
image_1c3p40004rhi3eljeng1g1ig91g.png-164.3kB

void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
image_1c3p42mif1ksa1rnv1r1hqps1f621t.png-253.4kB

9.2.5 紋理數組

紋理數組允許把一個集合組織起來,所有的紋理都具有相同的大小,都位於更高維度的一個紋理之中(例如,二維紋理的數組是三維紋理的一部分)。
image_1c3p4qt9nt29ph71t9d2eud6o2a.png-147kB

9.2.6 壓縮紋理圖像

在加載時壓縮紋理圖像
image_1c3p58jjdjqo17nnd341lk9u22n.png-74.6kB
image_1c3p5ccld1dqaqks1abk1qsp11m934.png-123.4kB

加載經過壓縮的紋理圖像
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);
image_1c3p5m5661ris1vlsp6812jj2p43u.png-261.9kB

經過壓縮的紋理替換已經加載的紋理的全部或一部分
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);
image_1c3p5tc5nnbeuvh11tg13tpv6h4b.png-248.4kB

9.2.8 mipmap:多重細節層

image_1c3p7ravqq04b8o37e1blb6bm4o.png-117.1kB
image_1c3p80iv8184c18aniccl7p1b9q55.png-463.6kB
image_1c3p80rnepkq1af713fa9aaq6n5i.png-316.7kB

五個大小不同,顏色不同的紋理組成mipmap效果
image_1c3pita661s0f1c51st6132q2jt5v.png-22.4kB

在實際應用程序中構建Mipmap
int glGenerateMipmap(GLenum target);
image_1c3pjlsnc1mjts9i1kg5dohmn6c.png-203.6kB

計算Mipmap層
image_1c3pk6quk4m11udh1ut3f991gmo79.png-313.7kB

Mipmap層的細節控制
image_1c3pkad461ke8gnelj91qc7181k8g.png-203kB
image_1c3pkeu0j1tm71mo2c9e1sg4qdd26.png-51.2kB
image_1c3pkdil2e3q1g583h71su24tep.png-441.2kB

image_1c3pki40h1jk319h59410pd1sgj33.png-141.4kB

9.3 過濾

屏幕上一個像素可以對應一個很廣的範圍,可能是一個紋理單元的一小部分(放大),也可能是多個紋理單元(縮小)。
image_1c3pl5i9ftq17mdios6dosdq3g.png-255.6kB
image_1c3pl6m1b1s53mmst5r1ae7vcv3t.png-110.4kB
image_1c3pl96ug1vd5153q1d514jl7fo4a.png-83.3kB
image_1c3plbd4r1829c2q13m5gvj1itg4n.png-347.5kB

image_1c3plluoo1s4g3gqraq1onqhvf54.png-326.9kB

9.4 紋理對象

image_1c3pme5lo16f21t25h39nih1ge5h.png-134.4kB

9.4.1 命名紋理對象

void glGenTextures(GLsizei n, GLuint* textureNames);
image_1c3pnhs2rm7b18ilnbaj1lljo5u.png-115.9kB

9.4.2 創建和使用紋理對象

void glBindTexture(GLenum target, GLuint textureName);
image_1c3pnl7se116gr21rjopao1ehj6b.png-222.9kB

9.4.3 清楚紋理對象

void glDeleteTexture(GLsizei n, const GLuint* textureNames);
image_1c3pnt1vi1r9cpv74421g3i1oc56o.png-136.4kB

9.4.4 常駐紋理工作集

如果想要知道多個紋理的紋理常駐狀態,可以使用glAreTextureResident()函數。
GLboolean glAreTextureResident(GLsizei n, const GLuint* textureNames, GLboolean* residences);
image_1c3podc7l1ukv13jkcmbv3a1hfj75.png-161.6kB

紋理常駐策略
image_1c3pohboh1mbs1pqo1ugi1pee17dt8i.png-314.7kB
void glPrioritizeTextures(GLsizei n, const GLuint* textureNames, const GLclampf* priorities);
image_1c3ppbt6pnno1ebugi3h201pdq9f.png-143.8kB

9.5 紋理函數

把紋理圖像的顏色與物體表面的原先顏色進行組合。
void glTexEnv{if}(GLenum target, GLenum pname, TYPE param);
void glTexEnv{if}v(GLenum target, GLenum pname, TYPE* param);
image_1c3pqpjr21nh41g38181rc291obias.png-261.8kB

image_1c3prls6i1bgt42ohdnp1sar9.png-63.5kB
TIM截圖20180114161140.png-284kB
image_1c3prne1r1mfifp3dbe6l24ltm.png-357.6kB
image_1c3prq5ldm9ijbf5u8gt19pb1j.png-155.3kB

9.6 分配紋理座標

頂點之間的紋理座標也會進行插值均和 紋理座標(s,t,r,q)對應頂點座標(x,y,z,w)

9.7 紋理座標自動生成

9.8 多重紋理

發佈了76 篇原創文章 · 獲贊 83 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章