Изменить прозрачность текстуры в OpenGL - PullRequest
11 голосов
/ 03 ноября 2008

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

Ответы [ 7 ]

16 голосов
/ 03 ноября 2008

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

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

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

7 голосов
/ 04 ноября 2008

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

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

2 голосов
/ 26 января 2011

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

2 голосов
/ 01 апреля 2010

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

1 голос
/ 28 июля 2009

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

1 голос
/ 03 ноября 2008

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

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

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

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

0 голосов
/ 20 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...