我正在尝试捕获具有透明背景的PNG图像。我已将GL_RGBA设置为glReadPixels中的格式。但是输出的PNG图像看起来有点偏黑或色彩饱和。如果backgrouund不透明,那就是如果我在glReadPixels中使用GL_RGB格式,则会捕获预期的图像。 注意:在这两种情况下,我都在捕获半透明(部分透明)的阴影立方体。如果立方体完全不透明,则RGBA格式可以正常工作。 关于透明背景为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
该立方体看起来更暗,因为它是半透明的,并且您用来查看图像的任何东西都会将其半透明部分与黑色背景融合在一起。
您可能会争辩说图片中的立方体不应该是半透明的,因为它是在完全不透明的背景上绘制的,但是问题是使用广泛的
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
混合模式(您似乎也使用过)在绘制半透明对象时会产生不正确的alpha值。
通常您看不到它,因为在绘制到默认的帧缓冲区时会丢弃alpha,但是在检查glReadPixels
的输出时它会变得很明显。
您已经注意到,要解决该问题,您可以简单地丢弃alpha分量。
但是如果您出于某种原因需要进行适当混合而没有这些问题,则需要
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
请注意,要使此功能正常工作,源图像和目标图像都必须采用预乘alpha 格式。也就是说,您需要做color.rgb *= color.a
作为着色器的最后一步。
可使用反操作(color.rgb /= color.a
)将图像转换回常规格式,但是如果图像完全不透明,则无需执行此步骤。