图像的存储空间
图像的存储空间 = 图像的高 * 图像的宽 * 每个像素的字节数
纹理文件
- OpenGL:TGA
- OpenGL ES、iOS:PNG
函数认识
改变像素存储方式
glPixelStorei(<#GLenum pname#>, <#GLint param#>)
恢复像素存储方式
glPixelStoref(<#GLenum pname#>, <#GLfloat param#>)
| 参数 | 释义 |
|---|---|
| pname | GL_UNPACK_ALIGNMENT指定OpenGL如何从缓存区中解包图像数据 |
| param | 表示参数GL_UNPACK_ALIGNMENT设置的值 |
Example:glPixelStorei(GL_UNPACK_ALIGNMENT,1),GL_UNPACK_ALIGNMENT指内存中每个像素行起点的排列请求,允许设置为1(byte排列)、2(排列为偶数byte的行)、4(字Word的排列)、8(行从双字节边界开始) |
从颜色缓存区内容作为像素图直接读取
glReadPixels(<#GLint x#>, <#GLint y#>, <#GLsizei width#>, <#GLsizei height#>, <#GLenum format#>, <#GLenum type#>, <#GLvoid *pixels#>)
| 参数 | 释义 |
|---|---|
| x | 矩形左下角的窗口坐标 |
| y | 矩形右下角的窗口坐标 |
| width | 矩形的宽,以像素为单位 |
| height | 矩形的高,以像素为单位 |
| format | OpenGL像素格式GLenum枚举值(见图例-1) |
| type | 像素数据的数据类型(见图例-2) |
| pixels | 指向图形数据的指针 |
载入纹理函数
glTexImage1D(<#GLenum target#>, <#GLint level#>, <#GLint internalformat#>, <#GLsizei width#>, <#GLint border#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
glTexImage2D(<#GLenum target#>, <#GLint target#>, <#GLint internalformat#>, <#GLsizei width#>, <#GLsizei height#>, <#GLint border#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
| 参数 | 释义 |
|---|---|
| target | 纹理的维度(GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D_EXT) |
| target | 指定加载的MIP贴图层次,一般设为0 |
| internalformat | 每个纹理单元中存储的多少颜色成分 |
| width height depth | 纹理的宽度,高度,深度(通常为2的次方) |
| border | 允许为纹理贴图指定一个边界宽度 |
| 其余参数 | 同上 |
更新纹理
glTexSubImage1D(<#GLenum target#>, <#GLint level#>, <#GLint xoffset#>, <#GLsizei width#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
glTexSubImage2D(<#GLenum target#>, <#GLint level#>, <#GLint xoffset#>, <#GLint yoffset#>, <#GLsizei width#>, <#GLsizei height#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
插入替换纹理
glTexSubImage2D(<#GLenum target#>, <#GLint level#>, <#GLint xoffset#>, <#GLint yoffset#>, <#GLsizei width#>, <#GLsizei height#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
glTexSubImage1D(<#GLenum target#>, <#GLint level#>, <#GLint xoffset#>, <#GLint yoffset#>, <#GLsizei width#>, <#GLsizei height#>, <#GLenum format#>, <#GLenum type#>, <#const GLvoid *pixels#>)
使用颜色缓冲区加载数据,形成新的纹理使用
glCopyTexImage1D(<#GLenum target#>, <#GLint level#>, <#GLenum internalFormat#>, <#GLint x#>, <#GLint y#>, <#GLsizei width#>, <#GLint border#>)
glCopyTexImage2D(<#GLenum target#>, <#GLint level#>, <#GLenum internalFormat#>, <#GLint x#>, <#GLint y#>, <#GLsizei width#>, <#GLsizei height#>, <#GLint border#>)
- x,y 在颜色缓存区中指定了开始读取微粒数据的位置;缓存区里的数据是缓存区通过
glReadBuffer设置的。
纹理对象
- 使用函数分配纹理对象;指定纹理对象的数量和指针(指针指向一个无符号整形数组,由纹理对象标识符填充)。
glGenTextures(<#GLsizei n#>, <#GLuint *textures#>)
- 绑定纹理状态
glBindTexture(<#GLenum target#>, <#GLuint texture#>)
- 删除绑定纹理对象
glDeleteTextures(<#GLsizei n#>, <#const GLuint *textures#>)
- 测试纹理对象是否有效
glIsTexture(<#GLuint texture#>)
设置纹理参数
glTexParameterf(<#GLenum target#>, <#GLenum pname#>, <#GLfloat param#>)
glTexParameteri(<#GLenum target#>, <#GLenum pname#>, <#GLint param#>)
glTexParameterfv(<#GLenum target#>, <#GLenum pname#>, <#const GLfloat *params#>)
glTexParameteriv(<#GLenum target#>, <#GLenum pname#>, <#const GLint *params#>)
| 参数 | 释义 |
|---|---|
| target | 指定纹理模式 |
| pname | 指定需要设置的纹理参数 |
| params | 设定指定纹理参数的值 |
设置过滤方式
- 邻近过滤(GL_NEAREST)
- 线性过滤(GL_LINEAR)
Example:
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) - 设置环绕方式
glTexParameteri(<#GLenum target#>, <#GLenum pname#>, <#GLint param#>)
Example:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
| 参数 | 释义 |
|---|---|
| target | GL_TEXTURE_2D GL_TEXTURE_1D GL_TEXTURE_3D |
| GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_WRAP_R | 针对s,r,t坐标 |
| GL_REPEAT GL_CLAMP GL_CLAMP_TO_EDGE GL_CLAMP_TO_BORDER | GL_REPEAT:在纹理坐标超过1.0的方向上重复 GL_CLAMP:所需纹理单元取自纹理边界或者TEXTURE_BORDER_COLOR GL_CLAMP_TO_EDGE:环绕模式强制对范围之外的纹理坐标沿合法的纹理单元的最后一行或者最后一列来进行采样 GL_CLAMP_TO_BORDER:在纹理坐标在0.0到1.0范围之外的只使用边界纹理单元。边界纹理单元是作为围绕基本图像的额外的行和列,并且和基本纹理一起加载 |
| 上述四种环绕方式图解 | |