Подтвердить что ты не робот

Изменение непрозрачности текстуры в OpenGL

Это, надеюсь, простой вопрос: у меня есть текстура OpenGL и вы хотите изменить ее непрозрачность, как мне это сделать? Текстура уже имеет альфа-канал, и смешение работает отлично, но я хочу, чтобы уменьшить непрозрачность всей текстуры, чтобы угаснуть ее в фоновом режиме. Я поиграл с glBlendFunc, но не повезло - кажется, мне нужно что-то вроде GL_SRC_ALPHA_MINUS_CONSTANT, которое недоступно. Я работаю над iPhone, с OpenGL ES.

4b9b3361

Ответ 1

Спасибо всем за идеи. Ive играл как с glColor4f, так и с glTexEnv и, наконец, заставил себя внимательно прочитать справочную страницу glTexEnv. В manpage говорится, что в режиме текстурирования GL_MODULATE результирующий цвет вычисляется путем умножения входящего фрагмента на цвет текстурирования (C = Cf × Ct), то же самое касается альфы. Я пробовал glColor4f (1, 1, 1, opacity), и это не сработало, но передача желаемой непрозрачности во все четыре аргумента вызова сделала трюк. (Тем не менее, я не знаю, почему.)

Ответ 2

Я понятия не имею о OpenGL ES, но в стандартном OpenGL вы должны установить непрозрачность, объявив цвет для текстуры, прежде чем использовать его:

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);

Пример даст вам 50% альфа, не влияя на цвет вашей текстуры. При настройке других значений вы также можете изменить цвет текстуры.

Ответ 3

Используйте объединитель текстур. Установите этап текстуры, чтобы выполнить операцию GL_MODULATE между текстурой и постоянным цветом. Затем измените постоянный цвет вашего кода (glTexEnv, GL_TEXTURE_ENV_COLOR).

Это должно стать "бесплатным" с точки зрения производительности. На большинстве (если не на всех) графических чипах объединительные операции принимают одинаковое количество циклов GPU (обычно 1), поэтому просто использовать текстуру и выполнять операцию модуляции (или любую другую операцию) - это точно такая же стоимость.

Ответ 4

В принципе у вас есть два варианта: используйте glTexEnv для вашей текстуры с GL_MODULATE и укажите цвет с помощью glColor4 * и используйте непрозрачный уровень для альфа-канала. Обратите внимание, что glTexEnv должен быть выпущен только один раз, когда вы сначала загружаете свою текстуру. Этот сценарий не будет работать, если вы укажете цвета в своих атрибутах вершин. Это будет отменять любой цвет glColor4 *, который вы можете установить. В этом случае вы можете прибегнуть к одному из двух вариантов: использовать комбинаторы текстур (расширенная тема, не рекомендуется использовать в фиксированном конвейере) или "вручную" изменить атрибут цвета вершины каждой отдельной вершины (может быть нежелательным для более крупные сетки).

Ответ 5

Самый простой способ - изменить значение текстуры альфа на лету. Поскольку вы скажете OpenGL о текстуре в какой-то момент, у вас будет растровое изображение в памяти. Поэтому просто перетащите текстуру в один и тот же идентификатор текстуры. Если у вас его нет в памяти (из-за ограничений пространства, поскольку вы находитесь на ES), вы можете снова получить текстуру в буфер, используя glGetTexImage(). Это чистое решение.

Сохранение/извлечение операций немного дорогостоящее, так что вам может понадобиться другое решение. Думая об этом, вы можете работать с геометрией за вашей геометрией, отображающей вашу текстуру, или просто работать над материалом/цветом геометрии, которая содержит текстуру. Вероятно, вы захотите добавить аддитивное смешение обратной геометрии. Использование glBlendFunc из

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

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

Ответ 6

Скорее всего, вы используете cg, чтобы получить изображение в текстуре. Когда вы используете cg, альфа предварительно умножается, поэтому вы должны использовать альфа для функции rgba функции color4f.

Ответ 7

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