OPENGL:如何使用 blit 将 alpha 移动到红色通道
OPENGL: How can I move alpha to red channel using blit
我正在尝试调试我的 gbuffer 帧缓冲区。我设法轻松地 blit 了 RGB 组件,但我想将 alpha 重新映射为红色或 rgb 以实现灰度,这样我也可以在不混合的情况下调试 alpha 组件。有没有办法做到这一点?提前致谢!
如果您只想按原样显示单个颜色通道,那么 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 帧缓冲区,而是使用帧缓冲区作为绑定纹理绘制全屏四边形。
我正在尝试调试我的 gbuffer 帧缓冲区。我设法轻松地 blit 了 RGB 组件,但我想将 alpha 重新映射为红色或 rgb 以实现灰度,这样我也可以在不混合的情况下调试 alpha 组件。有没有办法做到这一点?提前致谢!
如果您只想按原样显示单个颜色通道,那么 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 帧缓冲区,而是使用帧缓冲区作为绑定纹理绘制全屏四边形。