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





Я понятия не имею об OpenGL ES, но в стандартном OpenGL вы бы установили непрозрачность, объявив цвет текстуры перед ее использованием:
// R, G, B, A
glColor4f(1.0, 1.0, 1.0, 0.5);
Пример даст вам 50% альфа, не влияя на цвет вашей текстуры. Регулируя другие значения, вы также можете сместить цвет текстуры.
Ну, это зависит от приложения, но я обычно использую: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Это работает, потому что среда текстуры по умолчанию установлена на GL_MODULATE.
Самый простой способ - изменить значение альфа текстуры на лету. Поскольку в какой-то момент вы сообщаете OpenGL о текстуре, растровое изображение будет в памяти. Так что просто повторно привяжите текстуру к тому же идентификатору текстуры. Если у вас ее нет в памяти (из-за нехватки места, так как вы находитесь на ES), вы можете снова получить текстуру в буфер, используя glGetTexImage (). Это чистое решение.
Однако операции сохранения / извлечения немного дороги, поэтому вам может потребоваться другое решение. Подумав об этом, вы могли бы работать с геометрией, лежащей в основе вашей геометрии, отображающей вашу текстуру, или просто работать с материалом / цветом геометрии, которая содержит текстуру. Вы, вероятно, захотите добавить некоторое смешение обратной геометрии. Использование glBlendFunc из
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),
Вы могли бы «легко» и, что более важно, дешево достичь желаемого эффекта.
Один текстур обычно используется для нескольких объектов, его изменение приведет к изменению прозрачности для всех объектов. Кроме того, во многих системах загрузка текстур выполняется намного медленнее, чем простая операция копирования из-за внутренних преобразований формата.
Используйте комбайнер текстур. Установите этап текстуры для выполнения операции GL_MODULATE между текстурой и постоянным цветом. Затем измените постоянный цвет из вашего кода (glTexEnv, GL_TEXTURE_ENV_COLOR).
Это должно быть «бесплатным» с точки зрения производительности. На большинстве (если не на всех) графических чипах операции объединителя занимают одинаковое количество циклов графического процессора (обычно 1), поэтому простое использование текстуры по сравнению с выполнением операции модуляции (или любой другой операции) имеет точно такие же затраты.
Хм .. очень элегантное + простое решение, NeARAZ.
Скорее всего, вы используете cg для преобразования изображения в текстуру. Когда вы используете cg, альфа предварительно умножается, поэтому вам нужно использовать альфа для rgba функции color4f.
Спасибо всем за идеи. Я играл и с glColor4f, и с glTexEnv и наконец заставил себя внимательно прочитать справочную страницу glTexEnv. На странице руководства сказано, что в режиме текстурирования GL_MODULATE результирующий цвет вычисляется путем умножения входящего фрагмента на цвет текстурирования (C = Cf × Ct), то же самое касается альфа-канала. Я попробовал glColor4f (1, 1, 1, opacity), и это не сработало, но передача желаемой непрозрачности во все четыре аргумента вызова сработала. (Все еще не знаю, почему.)
И это заставило вас пометить свой «ответ» как принятый?
Да, поскольку это решило мою проблему. Не стесняйтесь не соглашаться :)
Вы неправильно настраиваете текстуры. То, что ответил Дэн, работает и имеет смысл, ваше «решение» - взлом.
Это нормально, если вы смешиваете результирующий цвет с фоном или alphablend с параметром GL_ONE для исходной альфы вместо GL_SRC_ALPHA. В этом случае вам не нужно будет менять все цветовые компоненты.
Я подозреваю, что у вас был черный фон, и, таким образом, уменьшая количество каждого цвета, вы фактически превращали цвет в черный.
В основном у вас есть два варианта: использовать glTexEnv для вашей текстуры с GL_MODULATE и указать цвет с помощью glColor4 * и использовать непрозрачный уровень для альфа-канала. Обратите внимание, что glTexEnv следует запускать только один раз при первой загрузке текстуры. Этот сценарий не будет работать, если вы укажете цвета в атрибутах вершин. Они, в частности, переопределят любой цвет glColor4 *, который вы можете установить. В этом случае вы можете прибегнуть к одному из двух вариантов: использовать комбайнеры текстур (расширенная тема, не рекомендуется использовать в фиксированном конвейере) или «вручную» изменить атрибут цвета вершины каждой отдельной вершины (может быть нежелательно для сетки большего размера).
Если вы используете современный OpenGL ..
Сделать это можно во фрагментном шейдере:
void main()
{
color = vec4(1.0f, 1.0f, 1.0f, OPACITY) * texture(u_Texture, TexCoord);
}
Это позволяет вам применять значение непрозрачности к текстуре, не нарушая смешения.
С какой настройкой для glBlendFunc?