Opengl 在GLSL着色器中混合RGBA和ALPHA格式图像

Opengl 在GLSL着色器中混合RGBA和ALPHA格式图像,opengl,glsl,Opengl,Glsl,我正在编辑一个为RGBA纹理编写的着色器 这与RGBA纹理的预期效果相同,例如: glTexImage2D(GL_纹理_2D,0,GL_RGBA,x,y,0,GL_RGBA,GL_无符号_字节,NULL) 。。。然后在glsl着色器中,可以使用访问其值纹理2d(特克斯、库尔德) 这一切都很好 但是,软件的一部分使用纯alpha纹理(其中其格式arg为GL_alpha),例如: glTexImage2D(GL_纹理_2D,0,GL_字母8,x,y,0,GL_字母,GL_无符号字节,NULL) 在这

我正在编辑一个为RGBA纹理编写的着色器

这与RGBA纹理的预期效果相同,例如:

glTexImage2D(GL_纹理_2D,0,GL_RGBA,x,y,0,GL_RGBA,GL_无符号_字节,NULL)

。。。然后在glsl着色器中,可以使用访问其值<代码>纹理2d(特克斯、库尔德)

这一切都很好

但是,软件的一部分使用纯alpha纹理
(其中其
格式
arg为
GL_alpha
),例如:

glTexImage2D(GL_纹理_2D,0,GL_字母8,x,y,0,GL_字母,GL_无符号字节,NULL)

在这种情况下,
texture2D()
中的RGB分量都为零


虽然这是预期的行为,但我想知道是否有办法:

  • 设置由
    texture2D

    返回的仅alpha纹理的
    RGB
    值(该值不会破坏RGBA纹理)
  • 在着色器中检查此类纹理以进行不同的处理

请注意,这可以通过“预处理器定义”(pre-processor Definites)作为最后手段来处理,但它已经充满了
#if
,因此如果可能,我宁愿避免,因为预处理器组合的数量增加了我们需要存储的着色器的数量。

您可以使用设置从纹理的任何组件提取的值。因此,如果确实具有仅alpha纹理,则可以使用swizzle遮罩将RGB值设置为1。或者在其他三个区域广播alpha值。或者可以将它们设置为0,但如果它们不在纹理中,则这是默认值

//Set other components to 1.
GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_ALPHA};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
显然,纹理必须绑定才能这样做

但这是你唯一的选择。不能将缺少的组件设置为任意值

不,着色器无法单独从采样器检测该纹理使用的格式。当然,您可以传递着色器可以检测并用于更改其使用提取值的方式的一致性。这样做甚至不会太贵,因为着色器代码可能如下所示:

vec4 val = texture(tex_unit, ...);
val.xyz = fill_defaults ? defaults : val.xyz;
对动态统一值执行简单的
?:
操作不会对性能产生实际影响。

您可以使用设置从纹理的任何组件提取的值。因此,如果确实具有仅alpha纹理,则可以使用swizzle遮罩将RGB值设置为1。或者在其他三个区域广播alpha值。或者可以将它们设置为0,但如果它们不在纹理中,则这是默认值

//Set other components to 1.
GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_ALPHA};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
显然,纹理必须绑定才能这样做

但这是你唯一的选择。不能将缺少的组件设置为任意值

不,着色器无法单独从采样器检测该纹理使用的格式。当然,您可以传递着色器可以检测并用于更改其使用提取值的方式的一致性。这样做甚至不会太贵,因为着色器代码可能如下所示:

vec4 val = texture(tex_unit, ...);
val.xyz = fill_defaults ? defaults : val.xyz;

动态统一值上的简单
?:
对性能没有实际影响。

“但是,软件的一部分使用纯alpha纹理(其格式arg为GL_alpha),例如:“仅供参考:这不是“纯alpha纹理”。描述了您正在上载的数据。纹理中的数据格式为,但未显示。因此,据我们所知,您的纯alpha纹理实际上可能是RGBA纹理。@nicol bolas想避免噪音,但您的右翼更新了该问题。相关问题:“然而,软件的一部分使用纯alpha纹理(其格式arg为GL_alpha),例如:“仅供参考:这不是“纯alpha纹理”。描述了您正在上载的数据。纹理中的数据格式为,但未显示。因此,据我们所知,您的纯alpha纹理实际上可能是RGBA纹理。@nicol bolas想避免噪音,但您的右侧更新了问题。相关问题: