Opengl预乘alpha图像渲染过程

时间:2014-05-16 15:49:38

标签: opengl premultiplied-alpha

我一直在学习OpenGL2.0渲染的东西,这里有一些关于alpha渲染的个人理解我想知道它们是否正确:

假设我有一个PNG(32位)文件(没有预乘的alpha图像)只有一个像素(src图像)

PNG                                                 Shader - glFragColor        GPU - SRC_ALPHA           SRC_ONE
(255, 0, 0, 255) - red / none transparent           (1.0, 0.0, 0.0, 1.0)        (1.0, 0.0, 0.0, 1.0)      (1.0, 0.0, 0.0, 1.0)
(255, 0, 0, 128) - red / half transparent           (1.0, 0.0, 0.0, 0.5)        (0.5, 0.0, 0.0, 0.75)     (1.0, 0.0, 0.0, 1.0)
(128, 0, 0, 255) - drak red / none transparent      (0.5, 0.0, 0.0, 1.0)        (0.5, 0.0, 0.0, 1.0)      (0.5, 0.0, 0.0, 1.0)
(128, 0, 0, 128) - drak red / half transparent      (0.5, 0.0, 0.0, 0.5)        (0.25, 0.0, 0.0, 0.75)    (0.5, 0.0, 0.0, 1.0)

以下是四个示例,每个示例包含4列。 以第2行为例:

1. The PNG image is red but half transparent so the rgba should be (255, 0, 0, 128)
2. The texture info is passed to frag shader and the value for glFragColor shoud be (1.0, 0.0, 0.0, 0.5)
3. When rendering the src color to GPU OpenGL will try to bend it with the dst color
4. let's say the dst color is (0, 0, 0, 255) and blend func for dst is GL_ONE_MINUS_SRC_ALPHA
5. if the blend func for dst is GL_SRC_ALPHA, the final pixel rendered will be (0.5, 0.0, 0.0, 0.75)
6. if the blend func for dst is GL_ONE, the final pixel rendered will be (1.0, 0.0, 0.0, 1.0)

(6)的结果肯定是错误的,因为透明度损失,而(5)的结果应该是好的。

这就是为什么我应该将GL_SRC_ALPHA用于预乘的alpha图像而GL_ONE用于预乘的alpha图像。

0 个答案:

没有答案