Visual Basic - мастерская разработчика
Библиотеки

DirectX

Обзоры
DirectDraw
Direct3D
DirectX Audio
DirectPlay
DirectInput
Fido Topics
SourceCode
Tools&Libs

OpenGL

Статьи и учебники
Fido Topics
SourceCode
Tools&Libs

Архив по Glide

Движки

Обзоры
Учебники
SourceCode
Downloads

Создание игр

Ваши игры

Обзорные статьи
Учебники
Fido Topics
SourceCode
Download

Stuff

Программер-Чат

Псевдо-FTP
Disclaimer
Оффтопик

 

Текстуры

Fido Themes (ru.directx)

От: Andrey Veselov <doc_@rbcmail.ru>
Тема: Текстуры
Дата: 12 марта 2001 г. 11:23

Hi all!

Вопрос. Есть следующий код:

=======
Render->Render_Start (); // начинаем
Render->Texture_Set (0,0);
// назначаем 0 текстуру из списка для stage 0
Render->Render_DrawFacet (&Facet);
// рисуем квадрат
Render->Render_End();
// все
=======

В Texture_Set (nStage, nIndex) идет следующее :

=======
pD3DDevice->SetTexture (nStage, Textures_pCache[nIndex]); // берем текстуру
pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
pD3DDevice->SetTextureStageState( nStage, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
=======

И все нормально.

если после

Texture_Set (0,0);

добавить

Texture_Set (1,1); // первую текстуру для stage 1

то по логике результат должен быть равен текстуре с индексом 1.
Однако получается серый квадрат... В MFCTex все нормально

пробовал просто исполнить перед рисованием квадарата
следующее (взятое прямо из MFCTex)

=======
pD3DDevice->SetTexture (0, Textures_pCache[0]);
pD3DDevice->SetTexture (1, Textures_pCache[1]);
pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );

pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
=======

тот же результат.
Где грабли ? Почему не получается положить две текстуры.

Пользую DX8. Карты GeForce2 GTS и TNT2.

--
С Уважением,
Андрей

3D Univerce [http://u3d.agava.ru]


От: Alexey Yakovenko <waker@mdart.com>
Тема: Re: Текстуры
Дата: 12 марта 2001 г. 14:04


"Andrey Veselov" <doc_@rbcmail.ru> wrote in message
news:98i0vh$2ico$1@ddt.demos.su...

> pD3DDevice->SetTexture (nStage, Textures_pCache[nIndex]); // берем текстуру
> pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
> pD3DDevice->SetTextureStageState( nStage, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
> pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLORARG1, D3DTA_TEXTURE );
> pD3DDevice->SetTextureStageState( nStage, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
> =======
>
> И все нормально.
>
> если после
> Texture_Set (0,0);
> добавить
> Texture_Set (1,1); // первую текстуру для stage 1
> то по логике результат должен быть равен текстуре с индексом 1.
> Однако получается серый квадрат... В MFCTex все нормально

а что записано в alphaarg1?
и нафиг colorarg2=diffuse если его игноришь?

>
> пробовал просто исполнить перед рисованием квадарата
> следующее (взятое прямо из MFCTex)
> =======
> pD3DDevice->SetTexture (0, Textures_pCache[0]);
> pD3DDevice->SetTexture (1, Textures_pCache[1]);
> pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
> pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
> pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
> pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
>
> pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
> pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
> pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
> pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
> =======
>
> тот же результат.
> Где грабли ? Почему не получается положить две текстуры.

можешь кинуть список всех SetRS/SetTSS вызванных перед твоим Texture_Set?
что возвращает ValidateDevice?
что рисуется если вызвать Texture_Set(1, 0)?
какая там текстура? может у нее бордюр серый?
какой у stage1 addressing mode? clamp?
если после второго Texture_Set вызвать pd3dDev->SetTexture(1, NULL)
результат тот же?


От: Andrey Veselov <doc_@rbcmail.ru>
Тема: Re: Текстуры
Дата: 13 марта 2001 г. 5:24

"Alexey Yakovenko" <waker@mdart.com>
wrote in message news:98iadc$kaq$1@ddt.demos.su...

> а что записано в alphaarg1?

pD3DDevice->SetTextureStageState( nStage, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );

> можешь кинуть список всех SetRS/SetTSS вызванных
> перед твоим Texture_Set?

а больше ничего... это тест для разработываемой библиотечки.
Поэтому там необходимый минимум для отрисовки квадрата:

pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
pD3DDevice->SetRenderState( D3DRS_LIGHTING, false);
pD3DDevice->SetRenderState( D3DRS_ZENABLE, true );

а все SetTSS я приводил в функции. Других не вызывается. Кстати, а какие может надо SetRS для такого текстурирования вызывать ?

> что возвращает ValidateDevice?

D3D_OK

> что рисуется если вызвать Texture_Set(1, 0)?

да проверял я так ;) текстура с индекосм 1.
Вообще в 0 тексуру гружу "кирпичную стенку", 1 - лайтмап.
Texture_Set(1, 0) - просто рисует голый лайтмап

> какая там текстура? может у нее бордюр серый?

уже ответил... лайтмап черно-белый

> если после второго Texture_Set вызвать
> pd3dDev->SetTexture(1, NULL) результат тот же?

Отображается только первая текстура (с индексом 0).

--
С Уважением,
Андрей

3D Univerce [http://u3d.agava.ru]


От: Alexey Yakovenko <waker@mdart.com>
Тема: Re: Текстуры
Дата: 13 марта 2001 г. 11:38

"Andrey Veselov" <doc_@rbcmail.ru> wrote in message
news:98k0as$v2g$1@ddt.demos.su...

> > что возвращает ValidateDevice?
> D3D_OK

а в параметре? он там должен вернуть сколько проходов может нарисовать. а вообще - похоже что текстурные координаты для stage1 неправильные (иначе откуда бы серый цвет взялся). попробуй:

settss( 0, D3DTSS_TEXCOORDINDEX, 0 );
settss( 1, D3DTSS_TEXCOORDINDEX, 0 );

еще попробуй переставить текстуры местами - сначала lightmap, сверху base. цвет изменится?


От: Andrey Veselov <doc_@rbcmail.ru>
Тема: Re: Текстуры
Дата: 13 марта 2001 г. 13:39

> > > что возвращает ValidateDevice?
> > D3D_OK
> а в параметре? он там должен вернуть сколько проходов может нарисовать.

1 ;)

> а вообще - похоже что текстурные координаты для stage1 неправильные (иначе

Верно.. см далее

> откуда бы серый цвет взялся). попробуй:
> settss( 0, D3DTSS_TEXCOORDINDEX, 0 );
> settss( 1, D3DTSS_TEXCOORDINDEX, 0 );
> еще попробуй переставить текстуры местами - сначала lightmap, сверху base.
> цвет изменится?

Все нашел.. прошу прощения что побеспокоил.... ;)))
Обдиная ошибка до смешного: координаты tu, tv лайтмапа инициализировались
криво. Отсюда и все глюки. Исправил и все заработало.

--
С Уважением,
Андрей

3D Univerce [http://u3d.agava.ru]

 

 


Проект
Создание Народного Учебника по OpenGL

Участвовать!
Поиск
Найдите статью или файл:


Рассылка
Новости сайта
La Vision в вашем почтовом ящике








Программирование на С++ Delphi и Паскаль
Центр демо-искусства в России