OPENGL:如何使用 blit 将 alpha 移动到红色通道

Posted

技术标签:

【中文标题】OPENGL:如何使用 blit 将 alpha 移动到红色通道【英文标题】:OPENGL: How can I move alpha to red channel using blit 【发布时间】:2017-03-07 22:46:11 【问题描述】:

我正在尝试调试我的 gbuffer 帧缓冲区。我设法轻松地对 RGB 组件进行了 blit,但我想将 alpha 重新映射为红色或 rgb 以获得灰度,这样我也可以在不混合的情况下调试 alpha 组件。有没有办法做到这一点?提前致谢!

【问题讨论】:

有什么原因你不能只阅读 alpha 版吗? @Nicol 我的问题是关于将 alpha 移动到不同的通道。如果您有 RGB 值,那么使用 Alpha 通道也会使其难以辨认。 【参考方案1】:

如果您只是想按原样显示单个颜色通道,那么glColorMask 应该就足够了。

假设你只想显示红色通道,你可以这样做:

glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);

如果您想切换 2 个颜色通道或应用灰度效果,那么通过着色器运行它可能是最简单的方法:

uniform sampler2D frame;

in vec2 uv;

out vec4 fragColor;

void main()

    vec4 color = texture(frame, uv);

    // Grayscale
    color.rgb = vec3((color.r + color.g + color.b) * 0.33);

    // Switch red and alpha channels
    color.ra = color.ar;

    fragColor = color;

因此,在对帧缓冲区进行 blitting 时,您绘制了一个以帧缓冲区作为绑定纹理的全屏四边形。

【讨论】:

谢谢,瓦伦丁!但是,没有其他方法可以交换频道吗?如果可能的话,我想尽量减少开销,我觉得使用命令会更好。 @KarimAbdelHamid 据我记得,没有。与绘制全屏四边形相比,blitting 可以更快但也可以更慢。所以通常你最好这样做。底线是,如果它成为实际的性能问题,则始终进行基准测试。 决定走四路。谢谢!

以上是关于OPENGL:如何使用 blit 将 alpha 移动到红色通道的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 上下文中使用 SDL 进行 Blitting

使用 OpenGL 调整图像大小

如何使用 OpenGL 在 SDL 中获得正确的 SourceOver alpha 合成

OpenGL alpha 混合突然停止

将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0 / c++ / Win32

如何使用 blit 有效地重绘多个 matplotlib 图