OpenGL图像格式:像素传送到GPU时GL驱动处理及显存像素存储形态
OpenGL像素上传处理逻辑及GL_R3_G3_B2格式存储说明
像素上传时驱动的核心处理流程
调用glTexSubImage*这类像素上传接口时,OpenGL驱动通常会按以下步骤执行:
- 参数合法性校验:首先验证传入的
internalformat、format、type参数组合是否符合规范,纹理对象状态是否合法,不合法直接返回对应错误码,终止上传流程。 - 原始数据解包:根据
GL_UNPACK_*系列状态(如行对齐、跳过像素数、字节序设置)和你指定的format、type参数,从用户提供的内存地址中解析出每个像素的原始值。 - 格式转换(按需执行):如果输入的像素格式和纹理的
internalformat不匹配,驱动会执行像素格式转换,把输入像素值映射到内部格式对应的取值范围。如果格式完全匹配则跳过这一步,没有额外性能开销。 - 显存写入:将处理好的像素数据写入纹理对应的显存区域,存储格式完全遵循
internalformat的规范定义。
你描述场景的显存存储形态
你给出的参数组合下,显存中单个像素的最终存储为8位无符号归一化整数,布局为高3位R通道、中间3位G通道、低2位B通道,既不是浮点格式,也不是3个32位浮点数。
具体原因如下:
GL_R3_G3_B2是OpenGL规范明确规定的固定大小无符号归一化内部格式,单像素占8位显存,不存在隐式转浮点的要求。- 你指定的
format=GL_RGB+type=GL_UNSIGNED_BYTE_3_3_2是和GL_R3_G3_B2完全匹配的上传格式组合,驱动不需要做任何格式转换,会直接将你传入的单字节像素数据原封不动写入显存。 - 只有当你显式指定
internalformat为浮点类型(如GL_RGB32F)时,驱动才会将输入像素转成32位浮点数存储,OpenGL不会随意修改你指定的内部存储格式,否则低比特纹理、压缩纹理等省显存的特性都无法实现。
内容的提问来源于stack exchange,提问作者Ji Regicide
相关产品推荐
相关产品推荐

