Я пытаюсь нарисовать две текстуры в 3D-пространстве, которые содержат прозрачность. Когда они не перекрываются, они работают нормально:
Однако, когда одна текстура перекрывает другую, прозрачность означает, что вы можете видеть ее позади:
При инициализации смешивания я использую GL_SRC_ALPHA
и GL_ONE_MINUS_SRC_ALPHA
.
Одна из возможностей заключается в использовании ключевого слова discard
в шейдере фрагментов, поскольку альфа-тест больше не у нас. Это имеет недостаток, заключающийся в том, что сглаженные края объектов.
Другая возможность - это сортировка по глубине объектов и возврат назад. Очевидным недостатком является необходимость выполнения преобразований и сортировки в первую очередь. Иногда это можно избежать, если порядок объектов можно определить статически (когда камера не сильно изменится). Другим недостатком является перетаскивание заштрихованных пикселей чем-то другим, поэтому отбрасывая производительность.
Наконец, вы можете использовать альфа-покрытие, где антиадресное оборудование используется для обеспечения прозрачности. Это не требует сортировки и делает края объектов гладкими. Недостатком является то, что это разрешено для каждого контекста рендеринга и может быть недоступным повсюду.
Вам нужно либо сортировать глубину, либо использовать альфа-тестирование:
glEnable(GL_ALPHA_TEST);
glAlphaTest(GL_GREATER, 0.0f);
который будет рисовать только пиксели с альфа-значением более 0f. Однако это не работает для смешивания прозрачных пикселей. Решение Andon - это тот, который я использую, хотя я работаю в 2D, и у меня должна быть прозрачность для эффектов дыма.