OpenGL 纹理

95 阅读2分钟

图像的存储空间

图像的存储空间 = 图像的高 * 图像的宽 * 每个像素的字节数

纹理文件

  • OpenGL:TGA
  • OpenGL ES、iOS:PNG

函数认识

改变像素存储方式

glPixelStorei(<#GLenum pname#>, <#GLint param#>)

恢复像素存储方式

glPixelStoref(<#GLenum pname#>, <#GLfloat param#>)
参数释义
pnameGL_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矩形的高,以像素为单位
formatOpenGL像素格式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) 邻近过滤.png
  • 线性过滤(GL_LINEAR) 线性过滤.png 邻近过滤和线性过滤对比.png 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)

参数释义
targetGL_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范围之外的只使用边界纹理单元。边界纹理单元是作为围绕基本图像的额外的行和列,并且和基本纹理一起加载
上述四种环绕方式图解
环绕方式.png

图例-1

图例-2