Мультитекстуринг

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Мультитекстуринг

Сообщение Maxwell » 24.10.2004 (Вс) 14:14

Возникла проблема с мультитекстуригом.
Есть текстура огоня (jpg) и решётки (tga с алфа каналом). Как мне настроить stage каждой текстуры, так что-бы огонь был
сплошной и просматривался через дырки решётки? :cry: А то у меня огонь то же с таким же дырами как и решётка.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.10.2004 (Вс) 20:27

может тебе просто использовать 2 полигона вместо 2х текстур?
ХЎ

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 25.10.2004 (Пн) 17:15

Нет, не подходит для сложных объектов. Я знаю, что можно как-то так настроить stage-и, Mikle в примере с огнём тоже настраивал тип смешивания 2-х текстур, только я ещё не понимаю как это работает. Если бы Mikle разъяснил:

Код: Выделить всё
d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_TEXTURE
 
d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_TEXTURE


Как какой тексель высчитывается при таких настройках, может и понятнее стало бы. Как для первой текстуры alpha канал второй взять - вот в чём вопрос. :?

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 25.10.2004 (Пн) 18:18

Вроде вникаю:

Код: Выделить всё
d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_TEXTURE
 
d3dDevice.SetTextureStageState 1, D3DTSS_ALPHAOP, D3DTOP_BLENDCURRENTALPHA
d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_TEXTURE


Но вот только теперь первой текстуры не видно а где дырки фон.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 27.10.2004 (Ср) 14:44

Код: Выделить всё
d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
 
d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT

Первая текстура обычная, вторая с альфа-слоем. AlphaOp и AlphaBlendEnable вообще не нужны.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 27.10.2004 (Ср) 17:46

Big Thanks! Еффекты, как в QIII для меня открыты. :wink:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 28.10.2004 (Чт) 1:26

Ну, мужики, сами того не ведая заставили Вы меня попарить мозги! Три вечера кряду бился над этим. Крутил параметрами и так и сяк - Не рисует текстуру из Stage 1, хоть убей. Модель то белая, то черная, то залита цветом пиксела 0,0. А собака была зарыта вот где

D3DDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0

Теперь работает.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 28.10.2004 (Чт) 15:14

Yurich
Это, вроде как, значение "по умолчанию". Видимо где-то раньше в программе оно у тебя менялось.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 28.10.2004 (Чт) 19:25

Нет, Майкл, по умолчанию D3DTSS_TEXCOORDINDEX равен номеру Stage-а (сам прочитал в SDK). И т.к. индекс №1 (и более высокие) не был инициализирован DX-средствами, tu и tv в нём =0.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 28.10.2004 (Чт) 20:09

Это значит что данный stage будет растягиваться по D3DFVF_TEX1
Если же:
Код: Выделить всё
D3DDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 1
То по D3DFVF_TEX2, и т.д.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 29.10.2004 (Пт) 9:08

Yurich
Сорри, не доглядел. Считал само собой разумеющимся, что раз у тебя две стадии текстурирования, значит у тебя вертекс-флаги содержат D3DFVF_TEX2, а вертексформат tu2 и tv2.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 29.10.2004 (Пт) 17:36

Появился вопрос - как поступить, если понадобится изменить tu & tv в верхних стадиях. То есть, я полностью повторил идею MAXWELL с огнем и решеткой, но не знаю, как сделать размер решетки (Stage 1) меньше или больше.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.10.2004 (Сб) 9:48

Yurich
Можно просто менять SetTransform для соответствующей стадии. Или я не понял вопрос?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.10.2004 (Сб) 16:59

Mikle!
Все стадии рисуются за один проход рендера и SetTransform не подойдет т.к. будет влиять на все текстуры и всю модель одновременно. Мне надо научиться изменять TextureMapping для каждой стадии в отдельности.
Главная проблема в том, что модель я гружу из Х-файла и флаги устанавливает сам директ. Попыталься сделать так:

Set MyMesh = D3DX.LoadMeshFromX(App.Path & "\Cube.x", D3DXMESH_MANAGED, D3DDevice, Nothing, MtrlBuffer, MatCount)

FVF = MyMesh.GetFVF Or D3DFVF_TEX2

Set MyMesh = MyMesh.CloneMeshFVF(D3DXMESH_MANAGED, FVF, D3DDevice)

вертекс-буфер увеличился почти вдвое но результат остался
прежним - вынужден применять D3DTSS_TEXCOORDINDEX, 0

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.10.2004 (Вс) 10:04

Yurich
Можно ВСЕ текстуры накладывать по одной паре tu & tv. Каждую двигать и масштабировать как хочешь. То, что это меш, а не вертексбуфер, не должно влиять. Другое дело, что больше двух текстур за проход могут накладывать видеокарты от GF3 кроме MX и Radeon, кажется от 8500. Вот пример огня с решеткой, но системные требования возрасли... :cry:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.10.2004 (Вс) 13:46

Кроме того, можно вообще обойтись без tu & tv, достаточно на все стадии включить:
Код: Выделить всё
  d3dDevice.SetTextureStageState n, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION

Но это только для демки с неподвижной камерой.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.11.2004 (Вт) 0:16

Mikle писал(а):Кроме того, можно вообще обойтись без tu & tv, достаточно на все стадии включить:
Код: Выделить всё
  d3dDevice.SetTextureStageState n, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION

Но это только для демки с неподвижной камерой.


Я уже пробовал испльзовать _TCI_ в разных вариациях - работает, дает красивые эффекты, но не более. Пока вопрос остался открытым. Майкл, твой пример на моей карточке выводит только черный экран с зависанием. Пока я не заметил ничего особенного в коде. Причины попытаюсь выяснить.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.11.2004 (Вт) 0:58

Окно по-прежнему черное, но пару цитат выдам:
1. По завершении программы делайте "контрольный выстрел в её башку". Имеется ввиду оператор END!
2. Дублируйте процедуры завершения в функциях Form_QueryUnload и Form_Unload.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.11.2004 (Вт) 11:55

Yurich
А что за видюшка?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.11.2004 (Вт) 20:03

Mikle писал(а):Yurich
А что за видюшка?

Древность - GF2MX400-64

Изо стало появляться после того, как заремарил все строки подобные
d3dDevice.SetTextureStageState 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
Но оно получилось мёртвое, без движения, к тому же неправильное.
Просмотрел CapsWiever-ом возможности видяхи - ни малейшего намёка на TEXTURETRANSFORMFLAGS - "Мёртвая сила * 2 = 0".
Майкл, снова обнаружил в коде уже изрядно надоевшие строки
d3dDevice.SetTextureStageState 2, D3DTSS_TEXCOORDINDEX, 0!
За что боролись, на то напоролись! Что делать? Создавать дополнительные вертексные буферы? Нет, будет накладно при использовании моделей с большим количеством вертексов. Рендерить за два и более проходов - вообще дурость ...
Как ещё можно менять положения текстур в стадиях?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 03.11.2004 (Ср) 0:00

Блин, снова наврал дед!
В собственном примере
d3dDevice.SetTextureStageState 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
работает как ни в чём не бывало!
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 03.11.2004 (Ср) 14:13

Yurich
Майкл, снова обнаружил в коде уже изрядно надоевшие строки
d3dDevice.SetTextureStageState 2, D3DTSS_TEXCOORDINDEX, 0

Нормальная строка, указывает, что стадия 2 берет текстурные координаты с первой пары tu & tv.
Я же написал, что больше двух текстур за проход могут обрабатывать GF от третьего. Для остальных придется делать два прохода. Это не дурость, а обычная практика. Перед вторым проходом меняем ZFUNC.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 03.11.2004 (Ср) 20:39

Сенкс, понял!


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList