《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 多重纹理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值