OpenGL ES 3.0 纹理格式介绍及有效的内部格式、格式、类型组合
一、简介本文主要列举 OpenGL ES 3.0 中纹理格式有哪些,以及有效的内部格式、格式、类型组合。内容来自于 《OpenGL ES 3.0 编程指南 原书第2版》。纹理格式主要应用于加载图像数据的相关接口,其中用于加载2D和立方图纹理的基本函数是 glTexImage2D,在 3.0 中还有多种替代方法指定 2D 纹理,如不可变纹理 glTexStorage2D 和 glTexSubIm..
一、简介
本文主要列举 OpenGL ES 3.0 中纹理格式有哪些,以及有效的内部格式、格式、类型组合。内容来自于 《OpenGL ES 3.0 编程指南 原书第2版》。
纹理格式主要应用于加载图像数据的相关接口,其中用于加载2D和立方图纹理的基本函数是 glTexImage2D
,在 3.0 中还有多种替代方法指定 2D 纹理,如不可变纹理 glTexStorage2D
和 glTexSubImage2D
的结合。
/**
* @param target 目标纹理,即 GL_TEXTURE_2D、GL_TEXTURE_3D、GL_TEXTURE_2D_ARRAY 或 GL_TEXTURE_CUBE_MAP
* @param level 指定要加载的mip级别。第一个级别为0,后续的mip贴图级别递增
* @param internalformat 纹理存储的内部格式
* @param width 图像的像素宽度
* @param height 图像的像素高度
* @param border 在OpenGL ES中忽略,保留是为了兼容桌面的OpenGL,传入0
* @param format 输入的纹理数据格式
* @param type 输入像素数据的类型
* @param pixels 包含图像的实际像素数据
*/
void glTexImage2D(
GLenum target, GLint level, GLint internalformat,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels)
重点概念:
- internalformat :纹理存储的内部格式
- format :输入纹理的数据格式
- type :输入像素的类型
二、有效的 internalformat、format 和 type 组合
1. 未确定大小的内部格式组合
使用未确定大小的格式指定纹理,则 OpenGL ES 实现可以自由选择纹理数据存储的内部表现形式。
内部格式 | 格式 | 类型 | 输入数据 |
---|---|---|---|
GL_RGB | GL_RGB | GL_UNSIGNED_BYTE | 8/8/8 RGB 24位 |
GL_RGB | GL_RGB | GL_UNSIGNED_SHORT_5_6_5 | 5/6/5 RGB 16位 |
GL_RGBA | GL_RGBA | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA 32位 |
GL_RGBA | GL_RGBA | GL_UNSIGNED_SHORT_4_4_4_4 | 4/4/4/4 RGBA 16位 |
GL_LUMINANCE_ALPHA | GL_LUMINANCE_ALPHA | GL_UNSIGNED_BYTE | 8/8 LA 16位 |
GL_LUMINANCE | GL_LUMINANCE | GL_UNSIGNED_BYTE | 8L 8位 |
GL_ALPHA | GL_ALPHA | GL_UNSIGNED_BYTE | 8A 8位 |
2. 确定大小的内部格式组合
如果应用程序希望更多地控制数据的内存存储格式,那么可以使用确定大小的内部格式。在这种情况下,OpenGL ES 3.0 实现可以选择转换为较少的位数,或者使用具有更多位数的格式。
其中又分为如下类别:规范化纹理格式、浮点纹理、整数纹理、共享指数纹理、sRGB纹理 和 深度纹理。
规范化纹理格式
所谓 “规范化” 指的是从片段着色器中读取纹理时,结果将映射到 [0.0, 1.0] 范围内(或者在 *_SNORM
格式中映射到 [-1.0, 1.0] 范围)。例如无符号字节值(范围 [0, 255])在片段读取时将映射到 [0.0, 1.0] 的范围。
内部格式 | 格式 | 类型 | 输入数据 | R | F |
---|---|---|---|---|---|
GL_R8 | GL_RED | GL_UNSIGNED_BYTE | 8位红色 | X | X |
GL_R8_SNORM | GL_RED | GL_BYTE | 8位红色(有符号) | X | |
GL_RG8 | GL_RG | GL_UNSIGNED_BYTE | 8/8 RG | X | X |
GL_RG8_SNORM | GL_RG | GL_BYTE | 8/8 RG(有符号) | X | |
GL_RGB8 | GL_RGB | GL_UNSIGNED_BYTE | 8/8/8 RGB | X | X |
GL_RGB8_SNORM | GL_RGB | GL_BYTE | 8/8/8 RGB(有符号) | X | |
GL_RGB565 | GL_RGB | GL_UNSIGNED_BYTE | 8/8/8 RGB | X | X |
GL_RGB565 | GL_RGB | GL_UNSIGNED_SHORT_5_6_5 | 5/6/5 RGB | X | X |
GL_RGBA8 | GL_RGBA | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA | X | X |
GL_RGBA8_SNORM | GL_RGBA | GL_BYTE | 8/8/8/8 RGBA(有符号) | X | |
GL_RGB5_A1 | GL_RGBA | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA | X | X |
GL_RGB5_A1 | GL_RGBA | GL_UNSIGNED_SHORT_5_5_5_1 | 5/5/5/1 RGBA | X | X |
GL_RGB5_A1 | GL_RGBA | GL_UNSIGNED_SHORT_2_10_10_10_REV | 10/10/10/2 RGBA | X | X |
GL_RGBA4 | GL_RGBA | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA | X | X |
GL_RGBA4 | GL_RGBA | GL_UNSIGNED_SHORT_4_4_4_4 | 4/4/4/4 RGBA | X | X |
GL_RGB10_A2 | GL_RGBA | GL_UNSIGNED_INT_2_10_10_10_REV | 10/10/10/2 RGBA | X | X |
备注:
- R = 格式可渲染
- F = 格式可过滤
- X 表示支持
浮点纹理格式
ES 3.0 引入了浮点纹理格式,大部分浮点格式由16位半浮点数据或者32位浮点数据支持。此外,还引入了 11/11/10 GL_R11F_G11F_B10F
这样的浮点格式,可提供更高精度的三通道纹理,同时仍保持每个纹素的存储量为32位,这种格式的使用可能达到比 16/16/16 GL_RGB16F
或 32/32/32 GL_RGB32F
更高的性能。
内部格式 | 格式 | 类型 | 输入数据 | R | F |
---|---|---|---|---|---|
GL_R16F | GL_RED | GL_HALF_FLOAT | 16位红色(半浮点) | X | |
GL_R16F | GL_RED | GL_FLOAT | 32位红色(浮点) | X | |
GL_R32F | GL_RED | GL_FLOAT | 32位红色(浮点) | ||
GL_RG16F | GL_RG | GL_HALF_FLOAT | 16/16 RG(半浮点) | X | |
GL_RG16F | GL_RG | GL_FLOAT | 32/32 RG(浮点) | X | |
GL_RG32F | GL_RG | GL_FLOAT | 32/32 RG(浮点) | ||
GL_RGB16F | GL_RGB | GL_HALF_FLOAT | 16/16/16 RGB(半浮点) | X | |
GL_RGB16F | GL_RG | GL_FLOAT | 16/16 RGB(浮点) | X | |
GL_RGB32F | GL_RG | GL_FLOAT | 32/32/32 RGB(浮点) | ||
GL_R11F_G11F_B10F | GL_RGB | GL_UNSIGNED_INT_10F_11F_11F_REV | 10/11/11(浮点) | X | |
GL_R11F_G11F_B10F | GL_RGB | GL_HALF_FLOAT | 16/16/16 RGB(半浮点) | X | |
GL_R11F_G11F_B10F | GL_RGB | GL_FLOAT | 32/32/32 RGB(浮点) | X | |
GL_RGBA16F | GL_RGBA | GL_HALF_FLOAT | 16/16/16/16 RGBA(半浮点) | X | |
GL_RGBA16F | GL_RGBA | GL_FLOAT | 32/32/32/32 RGBA(浮点) | X | |
GL_RGBA32F | GL_RGBA | GL_FLOAT | 32/32/32/32 RGBA(浮点) |
整数纹理格式
整数纹理格式允许纹理规范在片段着色器中以整数形式读取。即整数纹理中的值在片段着色器读取时仍然为整数,而不是转化为规范化浮点值。
内部格式 | 格式 | 类型 | 输入数据 | R | F |
---|---|---|---|---|---|
GL_R8UI | GL_RED_INTEGER | GL_UNSIGNED_BYTE | 8位红色(无符号整数) | X | |
GL_R8I | GL_RED_INTEGER | GL_BYTE | 8位红色(有符号整数) | X | |
GL_R16UI | GL_RED_INTEGER | GL_UNSIGNED_SHORT | 16位红色(无符号整数) | X | |
GL_R16I | GL_RED_INTEGER | GL_SHORT | 16位红色(有符号整数) | X | |
GL_R32UI | GL_RED_INTEGER | GL_UNSIGNED_INT | 32位红色(无符号整数) | X | |
GL_R32I | GL_RED_INTEGER | GL_INT | 32位红色(有符号整数) | X | |
GL_RG8UI | GL_RG_INTEGER | GL_UNSIGNED_BYTE | 8/8 RG(无符号整数) | X | |
GL_RG8I | GL_RG_INTEGER | GL_BYTE | 8/8 RG(有符号整数) | X | |
GL_RG16UI | GL_RG_INTEGER | GL_UNSIGNED_SHORT | 16/16 RG(无符号整数) | X | |
GL_RG16I | GL_RG_INTEGER | GL_SHORT | 16/16 RG(有符号整数) | X | |
GL_RG32UI | GL_RG_INTEGER | GL_UNSIGNED_INT | 32/32 RG(无符号整数) | X | |
GL_RG32I | GL_RG_INTEGER | GL_INT | 32/32 RG(有符号整数) | X | |
GL_RGBAUI | GL_RGBA_INTEGER | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA(无符号整数) | X | |
GL_RGBAI | GL_RGBA_INTEGER | GL_BYTE | 8/8/8/8 RGBA(有符号整数) | X | |
GL_RGB8UI | GL_RGB_INTEGER | GL_UNSIGNED_BYTE | 8/8/8 RGB(无符号整数) | ||
GL_RGB8I | GL_RGB_INTEGER | GL_BYTE | 8/8/8 RGB(有符号整数) | ||
GL_RGB16UI | GL_RGB_INTEGER | GL_UNSIGNED_SHORT | 16/16/16 RGB(无符号整数) | ||
GL_RGB16I | GL_RGB_INTEGER | GL_SHORT | 16/16/16 RGB(有符号整数) | ||
GL_RGB32UI | GL_RGB_INTEGER | GL_UNSIGNED_INT | 32/32/32 RGB(无符号整数) | ||
GL_RGB32I | GL_RGB_INTEGER | GL_INT | 32/32/32 RGB(有符号整数) | ||
GL_RG32I | GL_RG_INTEGER | GL_INT | 32/32 RG(有符号整数) | X | |
GL_RGB10_A2_UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT_2_10_10_10_REV | 10/10/10/2 RGBA(无符号整数) | X | |
GL_RGBA16UI | GL_RGBA_INTEGER | GL_UNSIGNED_SHORT | 16/16/16/16 RGBA(无符号整数) | X | |
GL_RGBA16I | GL_RGBA_INTEGER | GL_SHORT | 16/16/16/16 RGBA(有符号整数) | X | |
GL_RGBA32UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT | 32/32/32/32 RGBA(无符号整数) | X | |
GL_RGBA32I | GL_RGBA_INTEGER | GL_INT | 32/32/32/32 RGBA(有符号整数) | X |
共享指数纹理格式
共享指数纹理为不需要浮点纹理使用的那么多深度位数的大范围 RGB 纹理提供了一种存储方式。共享指数纹理通常用于高动态范围(HDR)图像,这种图像不需要半浮点或者全浮点数据。
OpenGL ES 3.0 中共享指数纹理的内部格式均为 GL_RGB9_E5
。该格式中,3个 RGB 分量共享一个5位的指数。5位的指数隐含地由数值15调整,RGB 的每个9位的数值存储无符号位的尾数(因此必然为正)。
输入数据推荐直接地将16位半浮点数或者32位浮点数传递给 OpenGL ES,让它进行计算转换为 RGB9_E5。
内部格式 | 格式 | 类型 | 输入数据 | R | F |
---|---|---|---|---|---|
GL_RGB9_E5 | GL_RGB | GL_UNSIGNED_INT_5_9_9_9_REV | 9/9/9 RGB 带5位指数 | X | |
GL_RGB9_E5 | GL_RGB | GL_HALF_FLOAT | 16/16/16 RGB(半浮点) | X | |
GL_RGB9_E5 | GL_RGB | GL_FLOAT | 32/32/32 RGB(浮点) | X |
sRGB 纹理格式
sRGB 是一个非线性颜色空间,大约遵循一个幂函数。如果用于纹理的图像是以 sRGB 颜色空间创作的,那么为了正确地处理 sRGB 图像,应用程序应该使用一个 sRGB 纹理格式。
内部格式 | 格式 | 类型 | 输入数据 | R | F |
---|---|---|---|---|---|
GL_SRGB8 | GL_RGB | GL_UNSIGNED_BYTE | 8/8/8 RGB | X | |
GL_SRGB8_ALPHA8 | GL_RGBA | GL_UNSIGNED_BYTE | 8/8/8/8 RGBA | X | X |
深度纹理格式
深度纹理允许应用程序从帧缓冲区对象的深度附着中读取深度值(和可选的模板值)。这在各种高级渲染算法中很有用,包括阴影贴图。
内部格式 | 格式 | 类型 |
---|---|---|
GL_DEPTH_COMPONENT16 | GL_DEPTH_COMPONENT | GL_UNSIGNED_SHORT |
GL_DEPTH_COMPONENT16 | GL_DEPTH_COMPONENT | GL_UNSIGNED_INT |
GL_DEPTH_COMPONENT24 | GL_DEPTH_COMPONENT | GL_UNSIGNED_INT |
GL_DEPTH_COMPONENT32F | GL_DEPTH_COMPONENT | GL_FLOAT |
GL_DEPTH24_STENCIL8 | GL_DEPTH_STENCIL | GL_UNSIGNED_INT_24_8 |
GL_DEPTH32F_STENCIL8 | GL_DEPTH_STENCIL | GL_FLOAT_32_UNSIGNED_INT_24_8_REV |
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)