Texture Alpha (Direct3D 9)
Alfa-waarden kunnen ook worden geleverd door patronen. Eerst moet het patroon worden gemaakt. Ten tweede moeten de alfawaarden worden toegevoegd aan het patroon. Als u het patroon wilt weergeven, stelt u het patroon in op een patroonfase en selecteert u de juiste patroonfasebewerking en operanden. Wanneer tekenen wordt aangeroepen, wordt de primitieve weergegeven met transparantie. In dit voorbeeld wordt een patroonresource gemaakt en vervolgens het alfakanaal geladen.
LPDIRECT3DTEXTURE9 m_pTexture;
// Create an alpha texture
D3DXCreateTexture(m_d3dDevice, 128, 128, 0, D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
// Initialize the alpha channel
int yGrad, xGrad;
D3DLOCKED_RECT lockedRect;
if(SUCCEEDED(pTexture->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD )))
{
m_pRGBAData = new DWORD[128*128];
if( m_pRGBAData != NULL )
{
for( DWORD y=0; y < m_dwHeight; y++ )
{
DWORD dwOffset = y*m_dwWidth;
yGrad = (int)(((float)y/(float)m_dwWidth) * 255.0f);
for( DWORD x=0; x < m_dwWidth; x )
{
xGrad = (int)(((float)x/(float)m_dwWidth) * 255.0f);
DWORD b = (DWORD)(xGrad + (255 - yGrad))/2 & 0xFF;
DWORD g = (DWORD)((255 - xGrad) + yGrad)/2 & 0xFF;
DWORD r = (DWORD)(xGrad + yGrad)/2 & 0xFF;
DWORD a = (DWORD)(xGrad + yGrad)/2 & 0xFF;
lockedRect.pBits[dwOffset+x] = ((a<<24L)+(r<<16L)+(g<<8L)+(b));
x++;
}
}
}
pTexture->UnlockRect(&lockedRect);
}
De alfawaarde wordt berekend op basis van de relatieve x/y-positie van de huidige pixel binnen de bitmapgrootte. Wijs vervolgens het patroon toe aan een patroonfase en stel de patroonfase in.
#define D3DFVF_LVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | \
D3DFVF_TEX0 )
// Assign texture
m_pd3dDevice->SetTexture(0, m_pTexture);
// Texture stage states
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
Dit resulteert in een primitieve met een doorzichtigheidsovergang. De kleurovergang is transparant waarbij x = 0 en ondoorzichtig waar x de maximumwaarde is.
Verwante onderwerpen