Почему RGBA делает изображение png черноватым? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь захватить изображение PNG с прозрачным фоном.Я установил GL_RGBA как формат в glReadPixels.Но выходное PNG-изображение выглядит немного черноватым или с насыщенным цветом.Если фон не прозрачен, то есть, если я использую формат GL_RGB в glReadPixels, ожидаемое изображение захватывается.Примечание. В обоих случаях выполняется захват полупрозрачного (частично прозрачного) заштрихованного куба.Если куб полностью непрозрачен, формат RGBA работает нормально.Есть идеи, почему это происходит на прозрачном фоне?

Черноватое изображение в формате RGBA

Изображение в формате RGB

1 Ответ

0 голосов
/ 19 февраля 2019

Куб выглядит темнее, потому что он полупрозрачен, и все, что вы используете для просмотра изображения, смешивает полупрозрачные части его с черным фоном.

Вы можете утверждать, что куб на рисунке не должен быть полупрозрачным, посколькуон нарисован поверх полностью непрозрачного фона, но проблема в том, что широко используемый режим смешивания

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

(который вы, похоже, также используете), как известно, приводит к неправильным альфа-значениям при использовании для рисованияполупрозрачные объекты.

Обычно вы не можете видеть его, потому что альфа отбрасывается при рисовании в буфер кадров по умолчанию, но становится заметным при проверке выходных данных glReadPixels.


По мере того как вызаметил, что для решения этой проблемы вы можете просто отказаться от альфа-компонента.

Но если вам по какой-то причине необходимо иметь правильное смешивание без этих проблем, вам нужно

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Обратите внимание, что для работы этой функции исходное и конечное изображения должны быть в предварительно умноженном альфа формат.То есть вам нужно сделать color.rgb *= color.a как последний шаг в ваших шейдерах.

Обратную операцию (color.rgb /= color.a) можно использовать для преобразования изображения обратно в обычный формат, но если ваши изображенияполностью непрозрачный, этот шаг не нужен.

...