Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Альфаканал


DevilDevil ©   (2006-11-08 19:30:00) 

Хочу вывести альфатекстуру в 2D режиме (типа Transparent). Причём сама она тоже должна быть прозрачной [прозрачность регулируется мной]. Получается не очень: Сама текстура становится светлее, Transparent-эффект работает несовсем, ... :

glPushAttrib(GL_ALL_ATTRIB_BITS);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);

glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
gluOrtho2D(0,WindowWidth,WindowHeight,0);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, MyTexture);

glcolor4ub(255, 255, 255, 128);// 128 - коэфициент прозрачности
glBegin(GL_QUADS);

glTexCoord2f(0, 1);
glVertex2f(X, Y);

glTexCoord2f(1, 1);
glVertex2f(X+TexWidth, Y);

glTexCoord2f(1, 0);
glVertex2f(X+TexWidth, Y+TexHeight);

glTexCoord2f(0, 0);
glVertex2f(X, Y+TexHeight);

glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glPopMatrix;
glPopAttrib;
glMatrixMode(GL_MODELVIEW);


DevilDevil   (2006-11-09 15:50:00) [1]

прискорбно...
Оказалось, у меня неправильно преобразуется само изображение, после непрвильно отслеживается альфаканал...


DevilDevil   (2006-11-09 15:16:00) [2]

glColor4ub(255, 255, 255, 255);
glAlphaFunc(GL_GEQUAL, 0.9);


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


Rial   (2006-11-09 14:58:00) [3]

> [2] DevilDevil ©   (09.11.06 12:08)
> Краткое предисловие: у меня есть квадратная текстура "баба
> с пистолетом", нарисована на синем фоне.

Отлично. Теперь я понял, что ты хотел сделать.

1.
Если в самой текстуре значения альфа принимают только
значиние 0 или 255, то при отрисовке прямоугольника
цвет надо задавать полностью белый.
Все дело в том, что цвет пикчелей текстуры - это одно,
а цвет полигонов - это другое. Они у тебя накладываются.
Получается примерно то же, как если бы у тебя
вмето 255 в текстуре были бы только 127.
Поэтому пиши
glColor4ub(255, 255, 255, 255);

2.
При загрузке текстуры следовало бы фильстровать
цвета, близкие к синему. Т.к. если грузится из
файл, использующего сжатие с потерями, то
эффект может быть несколько неожиданным.

Делается это либо попикселльно, что замедляет загрузку,
но несколько ускоряет использование, либо
вот так:
glAlphaFunc(GL_LEQUAL, MinAlpha);
glAlphaFunc(GL_GEQUAL, MaxAlpha);

Т.е, можно написать
glAlphaFunc(GL_LEQUAL, 0.1);
и все очень прозрачные части станут совсем прозрачными :)

3.
GL_QUADS медленне. не знаю, где написано.
Но там рисуентся 4 треугольника, когда как очевино,
что для отрисовки прямоугольника вполне
достаточно и двух.

Попробуй, отпишись о результатах...


DevilDevil   (2006-11-09 13:41:00) [4]

> glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
ещё хуже стало: транспарента вообще нет, синий цвет заменился на белый

> Возможно светлеет она от цвета квада (255,255,255,...)
в DGLE задаётся белый цвет: $FFFFFF


evgepet   (2006-11-09 12:58:00) [5]

Возможно светлеет она от цвета квада (255,255,255,...)

Попробуй ещё установить
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)

У меня тож такая трабла была и решилась очень просто, не помню как :)


DevilDevil   (2006-11-09 12:08:00) [6]

> Rial ©   (08.11.06 21:12) [1]
> 1-11  

:)

Краткое предисловие: у меня есть квадратная текстура "баба с пистолетом", нарисована на синем фоне. Соответственно синий фон не должен быть виден. В местах, где в битмапе цвет синий, альфаканал := 0 иначе альфаканал := 255;

1.)
сзади текстуры ничего нет, просвечивает синий цвет по периметру бабы.

2.)
надо мне уметь в 2D режиме работать

3.)
имхо это непричём

4.)
работает не так, как надо

5.)
всё это понятно конечно, но...

6.)
на всякий пожарный

7.)
где про это написано? интересно почитать

8.)см 6.)

9.)
ну нет особой разницы

10.)

glPushAttrib(GL_ALL_ATTRIB_BITS);
// -> мало ли, какие режимы ещё отключу
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
...
glPopAttrib;

11.)нет

ЗЫ
Первое, о чём можно подумать, это то, что текстура[а точнее альфаканал] неправильно создана. Я проверял, текстура, полученная таким образом в DGLE отображается корректно:
Begin2D;
      DrawTexture2D(MyTexture,X,Y,TexWidth,TexHeight,0,128,$FFFFFF,false);
End2D;

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

Надеюсь, подскажите, в чём тут загвоздка...


Rial   (2006-11-08 21:12:00) [7]

> [0] DevilDevil ©   (08.11.06 19:30)

1.
Если у тебя прозрачная текстура, что же сквозь нее,
такую вот прозрачную всю из себя,просвечивает то ?
Значит, еслть какие то объекты за этой текстурой, так ?
А раз они заней, значит коордитана Z у них другая.
Т.е. режим уже не 2D. Получаем противоречие, ч.т.д.

2.
Что мешает все рисовать в 3D, просто без перспективы,
будут тебе тогда объекты "спереди" и "сзади", и все будет хорошо с
прозрачностью.

3.
А ты порядок отрисовки учитываешь ?

4.
Как что то может работать не совсем ? Оно уж или работает, или нет.

5.
У тебя большую часть кода нет необходимости
выполнять при каждой перерисовке, вытащи его в обработчик
сообщения изменения размеров окна.

6.
glBindTexture(GL_TEXTURE_2D, 0); - это как понимать ?
С какой целью ты это делаешь ?

7.
GL_QUADS работает жутко медленно. Лучше рисуй треугольниками,
выиграешь в скорости как минимум в 2 раза.

8.
glBindTexture(GL_TEXTURE_2D, 0); - данная строка явно не на месте.

9.
glcolor4ub(255, 255, 255, 128); - режет глаз.
Лучше синглы или даблы ИМХО.

10.
glPushAttrib(GL_ALL_ATTRIB_BITS); - тоже не вполне понимаю, зачем
тут эта процедурка нужна. выкинь ее вообще.

11.
glEnd(); - это, я так понимаю, из C++ исходника украдено ?

Пока больше вопросов не имею :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо