Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Мультитекстурирование

279
09 апреля 2006 года
bave
456 / / 07.03.2004
Проблемка такая, мне нужно на полигон натянуть две текстуры, причём первая натягивается без изменений,
а у второй в альфа канале в некоторых пикселях значение 1.0, в некоторых 0.0 - вторую текстуру надо натянуть так
чтобы значения цвета пикселей первой текстуры заменялись на цвета пикселей второй текстуры, если в альфа канале
значение 1.0.
Вот подробней расписываю:
У меня есть две текстуры:
1. http://bave.izhevsk.net/tex1.jpg - первая.
2. http://bave.izhevsk.net/tex2.jpg - вторая.
--------------------------------------------------------------------------------------------
И есть маска для второй тестуры:
http://bave.izhevsk.net/mask.jpg - маска (я тут jpg-гами кидаюсь, но на самом деле я использую растры НЕ сжатые)
---------------------------------------------------------------------------------------------
Маску я присоединяю к альфа каналу втрой текстуры. Поскольку я страдаю ленью и слабоумием, я
не умею пользоваться PhotoShop'ом, поэтому накатал для себя маленькую программку, которая маску
цепляет к альфо каналу текстуры. Вот функция из этой программки, которая это и делает:
void joinmask(void *pbitmap, //указатель на растр втрой текстуры
void *pmask, //указатель на растр маски
unsigned int count) //по размерам маска и текстура, ессесвено, совпадают
{
__asm
{
mov ebx, pbitmap
mov edx, pmask
mov ecx, count
label1:
mov al,00h
mov edi,00000000h
push ecx
mov ecx,00000003h
label2: //проверяю имеет ли очередной пиксель маски чёрный цвет или нет....
cmp BYTE ptr [edx+edi],00h
je zero_byte
add al,1
zero_byte:
inc edi
dec ecx
jnz label2

cmp al,00h
je mask_byte
mov BYTE ptr [ebx+3],00FFh // в альфа канал текстуры - 255
jmp next
mask_byte: //если пиксель маски чёрного цвета, то в соответствующему пиксель текстуры в альфа канал - 0
mov BYTE ptr [ebx+3],00h
next:
pop ecx
add ebx,4
add edx,4
dec ecx
jnz label1
}
}
---------------------------------------------------------------------------------------------------

После того как прицепил к альфа каналу второй текстуры маску, натягиваю их на полигон, сначало первую, потом вторую:
glAlphaFunc(GL_EQUAL, GL_ONE);
glEnable(GL_ALPHA_TEST);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, bmfs[0].imgID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE);


glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, bmfs[1].imgID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_INTERPOLATE_EXT);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA);
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_DECAL);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
--------------------------------------------------------------------------------------------
И в результат получаю вот что:

http://bave.izhevsk.net/rezult.jpg
------------------------------------------------------------------------------------------------
Получается не то, что мне нужно, потому как область с альфа каналом - 0 заполнилась цветом фона, а мне надо чтоб она заполнилась соотв. цветами пикселей втрой текстуры. (чтоб там соотв. часть втрой текстуры была вообщем)
3.4K
10 апреля 2006 года
Dark Magician
37 / / 15.08.2004
Программист, страдающий слабоумием, ищет работу дизайнера. Рисую картинки в ассемблере. Быстро и качественно :):):)
Шутка, конечно :). Вообще Если поможешь с моим постом (чуть выше), кину исходники одной проги, которая это делает :)
279
10 апреля 2006 года
bave
456 / / 07.03.2004
Я уже сам нащёл где ошибка была :)
Теперь всё пашет!
---------------------------------
О как: http://bave.izhevsk.net/star.jpg
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог