Я пишу пользовательский интерфейс на основе PyOpenGL для ручного выравнивания изображений. Я показываю свои два изображения как текстурированные квадрациклы, движущиеся изображения поверх статической ссылки. Движущееся изображение показано красным цветом с изменяющейся альфа, то есть glColor4f(1.,0.,0.,overlay_opacity)
, а статическое изображение показано голубым цветом с постоянной непрозрачностью, равной одной, то есть glColor4f(0.,1.,1.,1.)
. Затем пользователь может изменять overlay_opacity
с помощью прокрутки мыши, чтобы исчезать между движущимися и опорными изображениями.opengl: смешанное смешивание нелинейных добавок
На данный момент я пользуюсь glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
. Хотя это позволяет мне плавно переходить между голубыми и красными изображениями, это также означает, что когда overlay_opacity
равно 0,5, я получаю только половину максимальной интенсивности красных и голубых изображений, поэтому результат выглядит тусклым и грязным. Если я использую glBlendFunc(GL_SRC_ALPHA,GL_ONE)
, я всегда получаю максимальную интенсивность для моего голубого изображения, поэтому я не могу его погасить. То, что я действительно хочу, это какое-то нелинейное смешивание, которое выглядит как третий график ниже:
Я предполагаю, что я мог бы, возможно, сделать это в пиксельный шейдер, но кажется, что там должно быть намного проще чтобы достичь того же результата, используя только glBlendFunc()
. Я также пробовал GL_SRC_ALPHA_SATURATE
, который, похоже, не работает в моей реализации.
Я бы просто кусаю пулю и делаю быстрый шейдер. Нет вопросов о том, что происходит :) –
@MichaelDorgan: вы не можете контролировать смешивание с помощью шейдера. Смешивание - одна из вещей, которые все еще остаются жесткими даже в современных графических процессорах. – datenwolf