Войти
ПрограммированиеФорумГрафика

D3D9-Вопросы. Device.SetGammaRamp() (3 стр)

Страницы: 1 2 3 4 58 Следующая »
#30
20:54, 2 апр. 2019

monobogdan
> Об этом и речь. Внутри D3D9 весь FFP на шейдерах и сделан.

это что - вот шейдера сделаны на микрошейдерах


#31
(Правка: 21:03) 21:01, 2 апр. 2019

innuendo
Все шейдора транслируются в асм, затем в объектники, затем в гапи, затем в драйвер, затем в нативный формат гпу.

Вывод: Пишите на гпу шейдерах.

#32
22:56, 2 апр. 2019

Хаус
> что-то не работает
А у меня работает.
Ты как выводишь спрайт? Какой формат вертекса? Надеюсь, ты не в два прохода рисуешь?
Если в один, то в какие семплеры загружены первая и вторая текстуры? Надеюсь в нулевой и первый, а не в первый и второй?
А текстурные координаты для первого семплера есть? Если нет - добавь строку:

SetTextureStageState (1, D3DTSS_TEXCOORDINDEX, 0);
Я проверил, работает.
#33
(Правка: 7:09) 5:30, 4 апр. 2019

Mikle

> Ты как выводишь спрайт?

Как обычно: DrawPrimitive(D3DPT_TRIANGLESTRIP)

> Какой формат вертекса?

D3DFVF_XYZ or D3DFVF_DIFFUSE or D3DFVF_TEX1

> Надеюсь, ты не в два прохода рисуешь?

Устанавливаю 2 текстуры и рисую 1 раз.

> А текстурные координаты для первого семплера есть?

не было, добавил.

Да, заработало:

  Device.SetTexture(0, TextureImage));
  Device.SetTexture(1, TextureMask));

  Device.SetRenderState(D3DRS_ALPHABLENDENABLE, iTRUE));
  Device.SetRenderState(D3DRS_SRCBLEND,         D3DBLEND_SRCALPHA));
  Device.SetRenderState(D3DRS_DESTBLEND,        D3DBLEND_INVSRCALPHA));

  Device.SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  Device.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(2, D3DTSS_COLOROP,   D3DTOP_DISABLE);

  Device.SetTextureStageState (1, D3DTSS_TEXCOORDINDEX, 0);

  DrawQuad(); 

  Device.SetTexture(0, nil);
  Device.SetTexture(1, nil);

только как отменить все эти установки стейджа, у других спрайтов альфа-канал стал выводиться чёрным.

#34
8:33, 4 апр. 2019

Хаус
> как отменить все эти установки стейджа, у других спрайтов альфа-канал стал выводиться чёрным

Device.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE);
А лучше все настройки в других стадиях завершать D3DTSS_COLOROP, D3DTOP_DISABLE, как я писал в п.26.
И на всякий случай это восстановить, вдруг где-то две пары текстурных координат:
Device.SetTextureStageState (1, D3DTSS_TEXCOORDINDEX, 1);
#35
(Правка: 8:59) 8:58, 4 апр. 2019

Mikle
А ещё лучше открыть документацию по DX и прочитать про стейты(это ТС).

Как по мне, лучше всего теоретический материал по гапи усваивается из спецификаций первых версий GL. Легко гуглится, если интересно.

#36
(Правка: 13:44) 13:39, 4 апр. 2019

Хаус
> не было, добавил.
Уточню, чтобы не было заблуждений, это ты не добавил текстурные координаты, это ты назначил первому семплеру текстурные координаты нулевого, а если бы добавил, поменялся бы флаговый формат вертекса на

D3DFVF_XYZ or D3DFVF_DIFFUSE or D3DFVF_TEX2
и в структуре вертекса нужно было бы добавить tu1 и tv1 кроме имеющихся уже tu0 и tv0.
И зачем D3DFVF_DIFFUSE в вертексе?
#37
(Правка: 8:48) 8:46, 6 апр. 2019

Mikle
> И зачем D3DFVF_DIFFUSE в вертексе?

что бы менять оттенок спрайта

monobogdan
> А ещё лучше открыть документацию по DX и прочитать про стейты(это ТС).

угу

Ещё вопрос, альфа в текстуре 0-Stage рисуется чёрной, а мне нужно чтобы она учитывалась. Как это исправить?

вообще я делаю типа стеклянную колбу с жидкостью, жидкость должна быть полупрозрачной

#38
9:37, 6 апр. 2019

Хаус
> альфа в текстуре 0-Stage рисуется чёрной, а мне нужно чтобы она учитывалась
Учитывалась как? Есть много способов, например:

Device.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
Device.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
Device.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
Хаус
> что бы менять оттенок спрайта
И для этого ты каждый раз меняешь во всех вертексах DIFFUSE?
Для этого существует TFACTOR:
Device.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
Device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
Device.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
Dev.SetRenderState (D3DRS_TEXTUREFACTOR ,0x808080);
При таком TFACTOR (808080) изменений не будет, меняя его, можно поканально регулировать оттенок.
#39
14:58, 6 апр. 2019

Mikle
> Учитывалась как?

ну чтобы альфа была прозрачной, а не чёрной

> Есть много способов, например:

хм, в результате только текстура вывелась, без учёта маски

> И для этого ты каждый раз меняешь во всех вертексах DIFFUSE?
> Для этого существует TFACTOR:

вот это круто! не знал, в HGE и других движках оттенок меняют через диффуз вроде бы

#40
(Правка: 15:26) 15:24, 6 апр. 2019

Хаус
> ну чтобы альфа была прозрачной, а не чёрной
Так блендинг включи

device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

> через диффуз вроде бы
Через диффуз в шейдере

#41
16:11, 6 апр. 2019

эти комбайнеры такие комбайнеры

#42
16:12, 6 апр. 2019

Хаус
> в результате только текстура вывелась, без учёта маски
Покажи весь набор SetTextureStageState.

#43
(Правка: 5:59) 5:59, 7 апр. 2019

Mikle
> Покажи весь набор SetTextureStageState.

  
  Device.SetTexture(0, TextureImage);
  Device.SetTexture(1, TextureMask);

  Device.SetTextureStageState (1, D3DTSS_TEXCOORDINDEX, 0);

  Device.SetRenderState(D3DRS_ALPHABLENDENABLE, iTRUE);
  Device.SetRenderState(D3DRS_SRCBLEND,         D3DBLEND_SRCALPHA);
  Device.SetRenderState(D3DRS_DESTBLEND,        D3DBLEND_INVSRCALPHA);

  Device.SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  Device.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(2, D3DTSS_COLOROP,   D3DTOP_DISABLE);


  Device.SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  Device.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  Device.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  Device.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);

  DrawQuad();

  Device.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE);

  Device.SetTexture(0, nil);
  Device.SetTexture(1, nil);

innuendo
> эти комбайнеры такие комбайнеры

что сказать хотел?

monobogdan
> Через диффуз в шейдере

HGE без шейдеров

> Так блендинг включи

а он включён

#44
8:51, 7 апр. 2019

Хаус
Ты дважды задаёшь D3DTSS_ALPHAOP и D3DTSS_ALPHAARG1 для первой стадии текстурирования, убери лишнее.
Но, если они идёт именно в таком порядке, как ты дал, всё равно должно работать, я проверил.
Ты уверен, что в нулевой текстуре (TextureImage) есть альфаканал?

Страницы: 1 2 3 4 58 Следующая »
ПрограммированиеФорумГрафика