{{notification.text}}

MirGames

15.08.09 03:32
0
Понадобилось мне вывести на экран...
Рисую в 2D, с маской. Маска правильная.
И вот в чем прокол - если над маской черный цвет под прозрачной частью - всё ок.
Если над маской (на самой спрайте) любой другой цвет - происходит какое то странное смешение... Может, не тот режим glBlendFunc юзаю?

Код
glDisable(GL_DEPTH_TEST);
glColor4f(1, 1, 1, 0);

glBlendFunc(GL_DST_COLOR,GL_ZERO);
glEnable(GL_BLEND);

SetTexture(T_TextureID);                                          //маска
DrawRectangle(X,Y,Width,Height);

glBlendFunc(GL_ONE,GL_ONE);
glAlphaFunc (GL_GREATER, 0.5);
glColor4f(color[0],color[1],color[2],color[3]);

SetTexture(TextureID);                                        //текстура
DrawRectangle(X,Y,Width,Height);
glDisable(GL_BLEND);

glEnable(GL_DEPTH_TEST);


И в догонку, второй вопрос по прозрачности. Эффективней ли будет собрать на ходу из двух изображений (маска+основной спрайт) одно 32битное, где 4й байт - степень прозрачности?
Отредактировано: 15.08.09 04:02
#1
15.08.09 08:39
0
glBlendFunc(GL_ONE,GL_ONE) - это сложение

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) ставь для обычного смешения по альфе

Цитата
Эффективней ли будет собрать на ходу из двух изображений (маска+основной спрайт) одно 32битное, где 4й байт - степень прозрачности?

Эффективней чем что?
#2
15.08.09 17:26
0
Чем рисовать в два этапа - сначала маску, потом изображение. Можно ведь маску интегрировать с изображением при загрузке (3 байта на цвет, 1 на прозрачность), или сие будет несколько не то?
#3
15.08.09 18:02
0
Вот блин, не выходит каменный цветок.
Есть текстура, 3 байта на цвет.
Белый цвет - полностью прозрачные цвета.
Черный - полностью непрозрачные.
Потом накладывается картинка, на которой серый цвет (128,128,128) там же, где и белый цвет на маске. Картинка тоже в 3 байта.
В предыдущей функции заменил
glBlendFunc(GL_ONE,GL_ONE);
на
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

Прозрачность исчезла совсем. А была частичная прозрачность на тех местах, где был серый+белый, и полностью непрозрачный, где любой цвет+черный.

Ниче не понимаю....
#4
15.08.09 18:06
0
Блин, ну так бы сразу и сказал, что у тебя нет альфы :) Ставь GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR, альфа тест отключи (альфы-то нет).
#5
15.08.09 18:32
0
Ррр. Так я сразу и сказал, что нет альфы, а маску использую...
Всё равно не выходит. Блин, пример бы нормальный увидеть рабочий, а то совсем запутался :(

Вот маска :
Изображение
Вот картинка:
Изображение
Вот что выходит:
Изображение
Т.е., серый цвет стал прозрачным частично. А мне нужна полная прозрачность.
Если на месте серого будет черный - будет полная прозрачность.

Вот используемый код
Код
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);

glBlendFunc(GL_DST_COLOR,GL_ZERO);
glEnable(GL_BLEND);

SetTexture(T_TextureID);                                          //маска
DrawRectangle(X,Y,Width,Height);

glBlendFunc(GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR);

SetTexture(TextureID);                                        //картинка
DrawRectangle(X,Y,Width,Height);
glDisable(GL_BLEND);

glEnable(GL_DEPTH_TEST);


Ну что тут не так? Всё, полный аут. Чтение красной книги пониманию не помогло, примеры найденные запутали окончательно. :wacko:
Отредактировано: 15.08.09 18:37
#6
15.08.09 19:38
0
Ой, сорри.

То, что ты спрашиваешь сделать нельзя, во всяком случае так просто. Создавай текстуру с нужным альфаканалом и используй ее.
#7
15.08.09 19:44
0
поставь перед отисовкой(не важно где просто поставь) glColor(свой серый цвет), должно сработать!
#8
15.08.09 19:46
0
visual
Э... а как же тогда маски (особенно генерируемые по ключевому цвету)? Для чего используются и как? Или маска при загрузке интегрируется в текстуру.. Тогда как будет выглядеть рисование в этом случае?

lans
а какие режимы смешивания ставить для маски и для самого изображения?
Отредактировано: 15.08.09 19:52
#9
15.08.09 19:57
0
Да, маска интегрируется в текстуру в качестве так называемого альфа-канала. Больше распространено, что где есть картинка - альфа на максимуме (255), а где нет - на минимуме (0).

Далее картинку нужно вывести один раз с включенным
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
(или glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA), см второе предложение первого абзаца.)
#10
15.08.09 20:18
0
Спасибо, значит, буду переписывать функцию загрузки изображения, чтобы пересобирала RGB в RGBA. :)
#11
15.08.09 20:55
0
Ура, получилось то, что нужно! Большое спасибо, до меня медленно, но всё-таки дошло всё, что нужно :)
Уточню (если кому ещё эта тема пригодится, всё таки тема важная...) - фильтрацию нужно отключать для таких текстур (использовать GL_NEAREST).
Для аксакалов сие конечно не секрет, но для новичков вроде меня пригодится наверняка)
Отредактировано: 15.08.09 21:01
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}