Как сделать текстуру частично прозрачной?

13

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

Вот мои настройки: у меня есть четырехугольник, представляющий стену, покрытую этой текстурой (преобразованный в PNG для загрузки). Очевидно, я хочу, чтобы стена была непрозрачной, за исключением стекол. За стеной есть другая плоскость, которая должна показать пейзаж. Я хочу увидеть пейзаж из-за окна. Каждая текстура представляет собой TGA с альфа-каналом.

Сначала отображается «пейзаж», а затем стена. Я думал, что этого будет достаточно для достижения этого эффекта, но, видимо, это не так. Часть окна, которая должна быть прозрачной, черная, и пейзаж появляется, только когда я прохожу мимо стены.

Я попытался возиться с GLBlendFunc () после его включения, но, похоже, это не сработало.

Я забыл важный шаг?

Спасибо :)

megamoustache
источник
Здравствуйте, добро пожаловать в gdse. Я немного отредактировал, нам не нравится помещать теги в заголовки вопросов (особенно когда вы используете один и тот же тег в тегах :)). И на ваш вопрос. Вы используете фиксированный конвейер или ваши собственные шейдеры?
Нотабене
Спасибо за редактирование. Я не уверен в значении «фиксированный конвейер», но я строю каждую вершину вручную и не использую никаких шейдеров. Если это имеет значение, я не использую последнюю версию openGL, поскольку она предназначена для школьного задания (я думаю, что это openGL 3).
мегамостация
Было бы здорово, если бы вы включили картинку в свой вопрос. Кажется, он исчез из своего первоначального местоположения.
ИЛИ Mapper

Ответы:

19

В дополнение ко всему, что вы заявили (текстуры с альфа-каналами, рисование ландшафта перед рисованием стены + окна), вам также нужно сделать еще две вещи.

Во-первых, вам нужно включить функцию смешивания OpenGL:

glEnable(GL_BLEND);

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

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

После включения смешивания OpenGL будет комбинировать цвета пикселей в соответствии с параметрами функции, которые вы задаете в glBlendFunc. В частности, он будет делать «source.color * source.alpha + destination.color * (1-source.alpha)», где «source» - это текстура, которую вы в данный момент визуализируете, а «destination» - это цвет уже в кадровый буфер (пейзаж). Поэтому, где ваш альфа-канал белый, вы получите цвет стены, а где-то черный канал, вы получите цвет ландшафта. Если альфа-канал имеет серый цвет, то вы получите некоторое затухание между двумя цветами.

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

Тревор Пауэлл
источник