替换 GL_LUMINANCE、GL_LUMINANCE_ALPHA
Posted
技术标签:
【中文标题】替换 GL_LUMINANCE、GL_LUMINANCE_ALPHA【英文标题】:Replacement for GL_LUMINANCE, GL_LUMINANCE_ALPHA 【发布时间】:2013-12-03 07:35:59 【问题描述】:对于内存效率高的实时嵌入式图形,当我需要无损灰度图像时,我通常使用使用GL_LUMINANCE
编码的 DDS 图像(或在需要 alpha 时使用GL_LUMINANCE_ALPHA
)。但是,我刚刚发现这些文件格式是 deprecated in OpenGL 3 并从 3.1 中删除。
对于每像素 8 位或更少(或涉及 alpha 时为 16bpp)的仅无损灰度数据,是否有替代图像格式?
【问题讨论】:
【参考方案1】:如果您在该 wiki 页面上向上滚动一点,您会看到 GL_RED/GL_R*
和 GL_RG*
用于 1 通道和 2 通道图像。
glTexImage2D()
:
GL_RED
:每个元素都是一个红色组件。 GL 将其转换为浮点数并将其组装成一个 RGBA 元素,方法是为绿色和蓝色附加 0,为 alpha 附加 1...
GL_RG
: 每个元素都是红/绿双色。 GL 将其转换为浮点数并通过附加 0 表示蓝色和 1 表示 alpha 将其组装成 RGBA 元素...
As GuyRT pointed out 如果您有 EXT_texture_swizzle/ARB_texture_swizzle
和/或 OpenGL 版本 >= 3.3,您可以使用 swizzle mask 扩展/重新排列纹理颜色组件。
【讨论】:
这些在语义上是否等价,因此GL_RED
应始终由着色器解释以跨 RGB 复制值,而 RG
应始终使用绿色/第二通道作为 alpha?跨度>
不,你必须自己在着色器中展开它们。
抱歉,我的意思是:从GL_RED
读取的着色器是否应该始终将值扩展到绿色和蓝色之间?或者这基本上是将GL_LUMINANCE
的明确含义插入GL_RED
的实现中?
我认为没有正式的或其他的约定。
您也可以使用 swizzling,以便您的着色器将值视为亮度/alpha - 看看:opengl.org/wiki/Texture#Swizzle_mask以上是关于替换 GL_LUMINANCE、GL_LUMINANCE_ALPHA的主要内容,如果未能解决你的问题,请参考以下文章