替换 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​的主要内容,如果未能解决你的问题,请参考以下文章

glsl fragmentshader 渲染对象ID

OpenGL中怎么使用压缩纹理?

FreeType - 纹理图集 - 为什么我的文字渲染为四边形?

C语言中,宏替换的替换规则

Word文字如何批量替换图片与所有图片替换为文字

linux 给文件替换字符串/替换内容/替换某行 (shell,sed)