OpenGL процесс умножения предварительно умноженного альфа-изображения
Я некоторое время изучал материалы рендеринга OpenGL2.0, и вот немного личного понимания альфа-рендеринга, и я хочу знать, правы ли они:
Скажем, у меня есть файл PNG (32 бита) (без предварительного умножения альфа-изображения) с одним пикселем (изображение 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 для предварительно не умноженного альфа-изображения и GL_ONE для предварительно умноженного альфа-изображения.