Textur alfa (Direct3D 9)
Alfavärden kan också tillhandahållas av texturer. Först måste strukturen skapas. För det andra måste alfavärdena läggas till i strukturen. Om du vill rendera med texturen ställer du in texturen på ett struktursteg och väljer lämplig strukturfasåtgärd och operander. När dragningen anropas återges primitiven med transparens. Det här exemplet skapar en strukturresurs och läser sedan in alfakanalen.
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);
}
Alfavärdet beräknas baserat på den aktuella pixelns relativa x/y-position inom texturstorleken. Tilldela sedan strukturen till ett textursteg och konfigurera textursteget.
#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);
Detta resulterar i en primitiv med en transparensgradient. Toningen är transparent där x = 0 och ogenomskinlig där x är dess högsta värde.
Relaterade ämnen