Альфа-маска в DirectX - PullRequest
       3

Альфа-маска в DirectX

1 голос
/ 08 ноября 2011

Я искал везде, и я не могу найти ответ, который работает.

Я пытаюсь сделать дыру в текстуре, имея "sheet.png" текстуру и "hole.png", являющуюсяальфа-маска.Это белое изображение с черным кружком, в котором я хочу, чтобы на листе было отверстие.

Как мне это сделать?Это то, что у меня есть, но все, что он делает, это рисует две текстуры друг на друге

md3dDev->SetTexture(0, gTexture);
md3dDev->SetTexture(1, holeTexture);

md3dDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
md3dDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);  

md3dDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
md3dDev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);

md3dDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE );
md3dDev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
md3dDev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );

md3dDev->SetRenderState( D3DRS_ALPHABLENDENABLE, true);
md3dDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);//alpha
md3dDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);//alpha

Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Первое правило: COLOROP идет с COLORARG, ALPHAOP идет с ALPHAARG, не смешивайте их.

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

  // multiply colorchannel from colortexture with diffuse lighting
  d3dSetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);   
  d3dSetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  d3dSetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
  // ignore alpha from colortexture
  d3dSetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);

  // ignoring colorchannel from alphatexture
  d3dSetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  // get alpha from alphatexture
  d3dSetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

Хотя это довольно устарело в наши дни.Используйте шейдеры!:)

0 голосов
/ 08 ноября 2011

Если вы пишете свои собственные шейдеры, просто умножьте альфы вместе.

Output = tex2d(Texture[0], uv)
Output.A *= tex2d(Texture[1], uv).A

, если вы используете фиксированный конвейер / эмуляцию, тогда я не уверен, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...