Поделиться через


Альфа вершины (Direct3D 9)

Альфа-данные могут быть предоставлены в данных вершины. Чтобы включить альфа вершины, задайте для D3DRS_DIFFUSEMATERIALSOURCE значение D3DMCS_COLOR1 чтобы среда выполнения Direct3D принимает диффузное значение из диффузного цвета, а не материала.

m_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE,  
                                D3DMCS_COLOR1 );

Затем укажите альфа-значения в диффузном цвете. Функция AddAlphaToASphere добавляет альфа к вершинам сферы. Ниже приведен пример предоставления альфа-информации функции.

AddAlphaToASphere( m_pObstacleVertices, 12,  
                    D3DRGBA(light.dcvDiffuse.r, light.dcvDiffuse.g, 
                            light.dcvDiffuse.b, vAlpha ));

Вот как выглядит функция.

 
void AddAlphaToASphere(D3DLVERTEX* pVertices, DWORD dwNumRings, D3DCOLOR lightcolor)
{
    WORD x, y;
    // rings around
    for( y=0; y < dwNumRings; y++ )
        for( x=0; x < (dwNumRings*2)+1; x++ )
            (pVertices++)->color = lightcolor;

    // top and bottom
    (pVertices++)->color = lightcolor;
    (pVertices++)->color = lightcolor;
}

AddAlphaToASphere просто изменяет элемент цвета каждой вершины типа D3DLVERTEX, чтобы включить альфа-данные.

D3DLVERTEX выглядит следующим образом.

 
// Lit vertex
typedef struct {
    D3DVALUE x, y, z;
    DWORD dwReserved;
    D3DCOLOR color, specular;
    D3DVALUE tu, tv;
} D3DLVERTEX, *LPD3DLVERTEX;

Рисование сферы,

#define D3DFVF_LVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | \
                        D3DFVF_TEX0 )

//...

// Draw the lit sphere
m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, D3DFVF_LVERTEX,
                                    m_pObstacleVertices, m_dwNumObstacleVertices,
                                    m_pObstacleIndices,  m_dwNumObstacleIndices, 0 );

приводит к прозрачной сфере с использованием альфа-канала вершины.

Альфа-смешивание