2
ИСЦитата:
четырех канальные текстуры это те которые RGBA?
Да, они самые.
Цитата:
тут я застрял на том что не понял как добавить альфа-канал картинке, которая у меня в bmp...
Но вы же все равно как-то загружаете данные из bmp-файла. Вот можно создать rgba-текстуру и вручную заполнять альфаканал в зависимости от значений пикселей основного изображения (например, если цвет пискселя картинки равен цвету "синего экрана", то в альфа-канале на этом месте помещаем ноль). Потом нужно будет скормить сформированный 4-мерный (с использованием
GL_RGBA вместо
GL_RGB) массив-буфер функции
glTexImage2D(...).
Для инициализации понадобятся вспомогательные gl-команды вроде этих:
Код:
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
N.B., если захочется использовать полупрозрачнось, то скорее всего придется решать проблемы с сортировкой объектов по удаленности от наблюдателя (алгоритм художника). В любом случае, возможно придется шаманить с буфером глубины, т.е. вызывать
glDisable(GL_DEPTH_TEST) перед прорисовкой объектов с прозрачностью.
Если тест глубины выключать не хочется, то можно (если возникают проблемы с отрисовкой) попробовать использовать альфа-тест (который, правда, не дружит с "плавной" полупрозрачностью):
Код:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1);
Причем, если нужна только бинарная прозрачность (без плавных переходов), то тогда вообще достаточно одного лишь альфа-теста, т.е., в этом случае можно выбросить все вызовы типа
glEnable(GL_BLEND) и
glBlendFunc(...).
Существует и другой, более древний (и несколько более тормознутый) способ отображение прозрачных текстур, не требующий попиксельного формирования альфа-канала или использования четырехканальных форматов графики (типа tga). Идея состоит в предварительном наложении маски с последующей прорисовкой текстуры (всюду будут применяться обычные rgb-текстуры без альфа-канала). В качестве маски должна использоваться двуцветная черно-белая картинка, все, скажем, белые пиксели которой станут в итоге прозрачными; фоновый цвет оригинальной текстуры пусть будет черным.
После того как включено смешивание и отключен тест глубины можно выбрать конкретный режим смешивание
glBlendFunc(GL_DST_COLOR, GL_ZERO) и наложить текстуру-маску на объект. Настоящая же, цветная текстура накладывается на тот же объект сразу после наложения маски, с предварительным включением режима
glBlendFunc(GL_ONE, GL_ONE).
Ну примерно так...
-- Пн дек 06, 2010 01:37:03 --Для экспериментов с прозрачностью могу посоветовать прикольную программульку
glsandbox.