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 在 SDL 中获得正确的 SourceOver alpha 合成