本篇在讲什么 OpenGL蓝宝书第十一章学习笔记之高级数据管理 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C++语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 |
![]() ★提高阅读体验★ 👉 ♠ 一级标题 👈👉 ♥ 二级标题 👈👉 ♣ 三级标题 👈👉 ♦ 四级标题 👈 |
♠ 本章的学习要点
- 如何将数据从着色器中直接写入缓冲与纹理
- 如何使用OpenGL更灵活地解读数据
- CPU与GPU如何直接共享数据
♠ 取消绑定
在着色器中绑定纹理到统一变量会有副作用
- OpenGL驱动程序支持的纹理单元数量有限
- 绑定与解绑各图像之间的纹理很费时
应对方法可以使用一种名为无绑定纹理
的功能
通过GL_ARB_bindless_texture
扩展,可以获得一个纹理控制柄,然后在着色器中直接使用该控制柄指代底层纹理而无须将纹理与纹理单元绑定
通过以下函数可以获取控制柄
GLuint64 glGetTextureHandleARB(GLuint texture);
GLuint64 glGetTextureSampleHandleARB(GLuint texture, GLuint sampler);
使用纹理前,需要告知OpenGL可使用,下面函数告知OpenGL纹理可使用
void glMakeTextureHandleResidentARB(GLuint64 handle);
下面函数从可使用清单清除
void glMakeTextureHandleNoResidentARB(GLuint64 handle);
♠ 稀疏纹理
通过GL_ARB_sparse_texture
扩展,纹理可以稀疏分布
稀疏纹理可分成许多方形或矩形区域,称为页面
未调拨页面时,OpenGL不会使用任何内存储存页面数据
注意:
OpenGL需要支持GL_ARB_sparse_texture
扩展,才可以使用稀疏纹理
创建稀疏纹理可以使用下面函数
glTexturestorage2D(tex,14,GL_RGBA8,16384,16384);
创建稀疏纹理时,在为纹理分配内存前,需要调用下面函数
glTextureParameteri(tex,GL_TEXTURE_SPARSE_ARB,GL_TRUE)
可调拨和释放纹理中已提供名称的稀疏纹理,使用下面函数
glTexPageCommitmentARB()
可通过下面函数确定页面大小和找出特定格式所支持的虚拟页面大小数量
glGetInternalformativ()
♠ 纹理压缩
介绍OpenGL支持的其中一种更为简单的纹理压缩格式,并展示如何为此类数据编写压缩程序
OpenGL支持的大部分纹理压缩格式是数据块
RGTC纹理压缩格式是OpenGL所支持的其中一种较简单的格式
- 数据块存储
- 每个数据块代表4x4纹素区域
RGTC格式仅支持二维图像
RGTC规范包括有符号类型和无符号类型,单分量和双分量格式
- GL_COMPRESSED_RED_RGTC1代表无符号类型单通道数据
- GL_COMPRESSED_SIGNED_RED_RGTC1代表有符号类型单通道数据
- GL_COMPRESSED_RG_RGTC2代表无符号类型双通道数据
- GL_COMPRESSED_SIGNED_RG_RGTC2代表有符号类型双通道数据
后续单开一篇介绍一下常用的压缩纹理,例如ETC、PVR等等
♠ 压缩数据格式
OpenGL所使用的类型几乎直接对应于C语言和其他高阶语言所使用的类型
OpenGL还支持一些不用C语言直接表示的数据类型,包括特殊数据类型GLHALE_FLOAT 和大量压缩数据类型
压缩数据正常C语言对此排列无表示方法
以下是OpenGL支持的压缩数据格式
格式 | 位元分配R | 位元分配G | 位元分配B | 位元分配A |
---|---|---|---|---|
GL_UNSIGNED_BYTE_3_3_2 | 7:5 | 4:2 | 1:0 | —— |
GL_UNSIGNED_BYTE_2_3_3_REV | 2:0 | 5:3 | 7:6 | —— |
GL_UNSIGNED_SHORT_5_6_5 | 15:11 | 10:5 | 4:0 | —— |
GL_UNSIGNED_SHORT_5_6_5_REV | 4:0 | 10:5 | 15:11 | —— |
GL_UNSIGNED_SHORT_4_4_4_4 | 15:12 | 11:8 | 7:4 | 3:0 |
GL_UNSIGNED_SHORT_4_4_4_4_REV | 3:0 | 7:4 | 11:8 | 15:12 |
GL_UNSIGNED_SHORT_5_5_5_1 | 15:11 | 10:6 | 5:1 | 0 |
GL_UNSIGNED_SHORT_1_5_5_5_REV | 4:0 | 9:5 | 14:10 | 15 |
GL_UNSIGNED_INT_8_8_8_8 | 31:24 | 23:16 | 15:8 | 7:0 |
GL_UNSIGNED_INT_8_8_8_8_REV | 7:0 | 15:8 | 23:16 | 31:24 |
GL_UNSIGNED_INT_10_10_10_2 | 31:22 | 21:12 | 11:2 | 1:0 |
GL_UNSIGNED_INT_210_10_10_REV | 9:0 | 19:10 | 29:20 | 31:30 |
GL_UNSIGNED_INT_24_8 | 31:8 | 7:0 | —— | —— |
GL_UNSIGNED_INT_10F_11F_11F_REV | 10:0 | 21:11 | 31:22 | —— |
♠ 高质量纹理过滤
最接近模式:表示点采样,仅选择中心最接近指定纹理坐标的纹素
线性过滤模式:混合至少两种纹素,生成着色器所需要的最终颜色
♠ 推送
- Github
https://github.com/KingSun5
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。