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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
14 605
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

С какой настройкой для glBlendFunc?

zoul 03.11.2008 18:12

Ну, это зависит от приложения, но я обычно использую: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Dan 03.11.2008 18:40

Это работает, потому что среда текстуры по умолчанию установлена ​​на GL_MODULATE.

noop 12.07.2011 19:34

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

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

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

Вы могли бы «легко» и, что более важно, дешево достичь желаемого эффекта.

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

noop 12.07.2011 19:33

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

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

Хм .. очень элегантное + простое решение, NeARAZ.

mstrobl 04.11.2008 20:52

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

Ответ принят как подходящий

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

И это заставило вас пометить свой «ответ» как принятый?

zmippie 26.01.2011 11:48

Да, поскольку это решило мою проблему. Не стесняйтесь не соглашаться :)

zoul 26.01.2011 11:50

Вы неправильно настраиваете текстуры. То, что ответил Дэн, работает и имеет смысл, ваше «решение» - взлом.

cjcela 17.03.2011 16:11

Это нормально, если вы смешиваете результирующий цвет с фоном или alphablend с параметром GL_ONE для исходной альфы вместо GL_SRC_ALPHA. В этом случае вам не нужно будет менять все цветовые компоненты.

noop 12.07.2011 19:36

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

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

Если вы используете современный OpenGL ..

Сделать это можно во фрагментном шейдере:

void main()
{
     color = vec4(1.0f, 1.0f, 1.0f, OPACITY) * texture(u_Texture, TexCoord);
}

Это позволяет вам применять значение непрозрачности к текстуре, не нарушая смешения.

Другие вопросы по теме