Куб выглядит темнее, потому что он полупрозрачен, и все, что вы используете для просмотра изображения, смешивает полупрозрачные части его с черным фоном.
Вы можете утверждать, что куб на рисунке не должен быть полупрозрачным, посколькуон нарисован поверх полностью непрозрачного фона, но проблема в том, что широко используемый режим смешивания
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
) можно использовать для преобразования изображения обратно в обычный формат, но если ваши изображенияполностью непрозрачный, этот шаг не нужен.