OpenGL 纹理

194 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境搭建 - MacOS

今天开始,我们开始整理关于 OpenGL中纹理的知识点。

原始图像数据

1.像素包装
图像存储空间=图像的高度 * 图像宽度* 每个像素的字节数

认识函数

  • 改变像素存储方式
void glPixelstorei (GLenum pname, GLint param);
  • 恢复像素存储方式
void glPixelStoref (GLenum pname, GLfloat param) ;
  • 参数1:GI UNPACK AIIGNMEN工 指定openGI 如何从数据缓存区中解包图像数据
  • 参数2:表示参数GI UNPACK ALICNMENI 设置的值
  • GL_UNPACK_ AL IGNMEN工 指内存中每个像素行起点的排列请求,允许设置为1(byte排列)、2(排列为偶数byte的行)、4 (宇wora排列)、8(行从双字节边界开始)
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

认识函数 从颜色缓存区内容作为像素图直接读取

//参数1:2,矩形左下角的窗口坐标
//参数2:y,矩形左下角的窗口坐标
//参数3:wiath,矩形的宽,以像素为单位
//参数4:height,矩形的高,以像素为单位
//参数5:format,opencI 的像素格式,参考 表6-1
//参数6: type,解释参数pixe 1s指向的数据,告诉openGI 使用缓存区中的什么数据类型来存储颜色分量,像素数据的数据类型,参考 表6-2
//参数7:pixels,指向图形数据的指针
void glReadPixels (GLint s,GLint y,GIsizei vidth, GIsizei
height, GLenum format, GLenum type, const void * pixels) ;

glReadBuffer(mode);->指定读取的缓存
glWriteBuffer (mode),一>指定写入的缓存

认识函数

载入纹理

green void glTexImagelD (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, void *data) ;

void gllexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void * data);

void glTexImage3D (GLenum target, GLint level, GLint internalformat, GLSizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, void *data) ;

  • target:GI IEXTURE 1DGITEXTURE_2DGL TEYTURE 3D
  • Leve1:指定所加载的mip贴图层次。一般我们都把这个参数设置为0。
  • internalformat:每个纹理单元中存储多少颜色成分。
  • width、height、depth参数:指加载纹理的宽度、高度、深度。二=注意!==这些值必须是2的整数次方。 (这是因为opencL 1日版本上的遗留下的一个要求,当然现在已经可以支持不是2的整数次方。但是开发者们还是习惯使用以2的整数次方去设置这些参数。
  • border参数:允许为纹理贴图指定一个边界宽度,
  • format、txpe、data参数:与我们在讲g1DrawPixe1s 西数对于的参数相同

更新纹理

void glTexSubImagelD (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum
format, GLenum type, const GLvoid *data) ;

void glTexSubImage2D (GLenum target, GLint level, GLint x0ffset, GLint yOffset, GLsizei
width, Glsizei height, GLenum format, GLenum type, const GLvoid *data) ;

void glTexSubImage3D (GLenum target, GLint level, GLint x0ffset, GLint yOffset,GLint
Offset, GLsizei width, GLsizei height, GLsizei depth, Glenum type, const GLvoid * data) ;

插入替换纹理

void glopyTexSubImagelD(GLenum target, GLint level, GLint xoffset, GLint «, GLint y, GLsize width);

void glCopyTexSubImage2D (GLenum target, GLint level, GLint offset, GLint yoffset, GLint x,GLint Y, GLsizei width, Glsizei height) ;

void glCopyTexSubImage3D (GLenum target, GLint level, GLint offset, GLint yOffset, GLint zOffset, GLint ×, GLint y, GLsizei width, GLsizei height) ;

认识函数 使用颜色缓存区加载数据,形成新的纹理使用

void glCopyTexImagelD (GLenum target, GLint level, GLenum internalformt, GLint x, GLint y, GLsizei width, GLint border) ;

void glCopyTexImage2D (GLenum target, GLint level, GLenum internalformt, GLint ×, GLint y, GLsizei width, GLsizei height, GLint border);
  • x,y 在颜色缓存区中指定了开始读取纹理数据的位置;缓存区里的数据,是源缓存区通过g1ReadBuffer设置的。

注意:不存在g1copyrextImage3D, 因为我们无法从2D 颜色缓存区中获取体积数据。