如何将GL_RED转换为GL_RGBA格式

3

这是片元着色器的代码。

in vec2 TexCoord;
uniform sampler2D texture1;
out vec4 OutColor;
    
void main()
{
    OutColor = texture( texture1 , TexCoord);
}

当传递任何GL_RED格式的纹理时,灰度图像会输出为红色。

我可以通过在着色器中使用红色参数来解决这个问题,但是是否可能将GL_RED图像作为GL_RGBA图像发送到着色器?

unsigned char* image = SOIL_load_image(file, &width, &height,  &channels , SOIL_LOAD_AUTO);  
// Set The Internal Format
if (channels == 4)
{
    texture.Internal_Format = gammaCorrect ? GL_SRGB_ALPHA : GL_RGBA;
    texture.Image_Format = gammaCorrect ? GL_SRGB_ALPHA : GL_RGBA;
}
else if(channels == 3)
{
    
    texture.Internal_Format = gammaCorrect ? GL_SRGB : GL_RGB;
    texture.Image_Format = gammaCorrect ? GL_SRGB : GL_RGB;
}
else if (channels == 1)
{
    texture.Internal_Format = GL_RED;
    texture.Image_Format = GL_RED;
}
1个回答

3
使用glTexParameter设置纹理交换参数。例如:
glBindTexture(GL_TEXTURE_2D, textureObject);

if (channels == 1)
{
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
}

这将设置应用于组件的混合方式。借助这个方法,可以从不同的通道中取出一个组件。


非常感谢,很久没有收到你的消息了。只有一个问题,这也会为其他RGBA纹理设置混合方式,那么我如何关闭其他RGBA纹理的混合方式呢? - Summit
@Summit 这是一个仅应用于当前绑定纹理的纹理参数。我在这一点上的回答不太清楚。我已经更正了。 - Rabbid76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接