为什么 OPENGL 缺少无符号的 16 位 RGB 格式?
Why is OPENGL missing 16-bit RGB format that is unsigned?
我一直在使用 GL_R16 格式的 16 位单色纹理。这很好用。
我现在需要一个 3 通道 16 位纹理。
不过,在查看联机帮助页 glTexStorage2D 时,我发现功能上似乎存在差距。
一个频道可用:GL_R16
两个频道可用:GL_RG16
四个通道可用:GL_RGBA16
但是三个通道,只有 SNORM(有符号归一化)风格:GL_RGB16_SNORM.
GL_RGB16怎么了?添加第四个频道似乎很浪费,所以我想避免这种情况。我也想避免处理 -1..1 样本,因为我的数据是无符号的。
What happened to GL_RGB16
?
没关系。它是一种允许的格式,并且对于纹理也需要支持格式(与使用此类纹理作为渲染到纹理的帧缓冲区附件时相反),根据 OpenGL 4.6 core profile spec 中的 table 8.12 .
不幸的是,那些 OpenGL“参考页面”是出了名的不完整、过时、经常具有误导性,有时甚至是完全错误的。唯一可靠的文档来源是 OpenGL 规范。
Adding a 4th channel seems wasteful, so I would like to avoid that
硬件如何处理这种格式完全是另一回事。例如,任何现实世界的 GPU 都会在内部将 GL_RGB8
填充为 RGBA,因为它们不喜欢 3 字节对齐的纹素。如果他们也不喜欢 GL_RGB16
的 6 字节对齐,我也不会感到惊讶。
我一直在使用 GL_R16 格式的 16 位单色纹理。这很好用。 我现在需要一个 3 通道 16 位纹理。
不过,在查看联机帮助页 glTexStorage2D 时,我发现功能上似乎存在差距。
一个频道可用:GL_R16
两个频道可用:GL_RG16
四个通道可用:GL_RGBA16
但是三个通道,只有 SNORM(有符号归一化)风格:GL_RGB16_SNORM.
GL_RGB16怎么了?添加第四个频道似乎很浪费,所以我想避免这种情况。我也想避免处理 -1..1 样本,因为我的数据是无符号的。
What happened to
GL_RGB16
?
没关系。它是一种允许的格式,并且对于纹理也需要支持格式(与使用此类纹理作为渲染到纹理的帧缓冲区附件时相反),根据 OpenGL 4.6 core profile spec 中的 table 8.12 .
不幸的是,那些 OpenGL“参考页面”是出了名的不完整、过时、经常具有误导性,有时甚至是完全错误的。唯一可靠的文档来源是 OpenGL 规范。
Adding a 4th channel seems wasteful, so I would like to avoid that
硬件如何处理这种格式完全是另一回事。例如,任何现实世界的 GPU 都会在内部将 GL_RGB8
填充为 RGBA,因为它们不喜欢 3 字节对齐的纹素。如果他们也不喜欢 GL_RGB16
的 6 字节对齐,我也不会感到惊讶。