0

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

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

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 图像。

4

0 回答 0