Hallo,
in meinem Spiel sollen verschiedene Objekte transparent dargestellt werden.
Daher hab ich eine Funktion SetTransparency(float fPercent) eingebaut,
die alle Vertices eines Modells durchgeht und deren Alpha-Werte auf den
gewünschten Wert setzt. Der Code sieht so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
m_fAlpha = fPercent;
int iAlpha = (int)(fPercent * 2.55f);
m_pMesh->LockVertexBuffer(0, (void**)&m_pVertices));
for (int i = 0; i < m_iNumVertices; i++)
{
m_pVertices[i].color = D3DXCOLOR(150, 150, 150, iAlpha);
}
m_pMesh->UnlockVertexBuffer();
|
Die Farbwerte der Objekte sind nicht so interessant, daher setze ich sie
alle auf 150 um ein normales Grau zu bekommen, später kommt eh
eine Textur drüber, nur den Alphawert setze ich auf den entsprechenden
Wert.
Zum Zeichnen setze ich die entsprechenden RenderStates, sofern m_fAlpha
auch gesetzt ist und zeichne anschließend ganz normal das Objekt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
if (m_fAlpha)
{
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
}
m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
for(int i = 0; i < (int)m_dNumMtrls; i++)
{
m_pd3dDevice->SetMaterial(m_Materials[i]);
m_pd3dDevice->SetTexture(0, m_Textures[i]);
m_pMesh->DrawSubset(i);
}
if (m_fAlpha)
{
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
mm_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
}
|
Das Ergebnis is, dass das Objekt vollständig weiß gezeichnet wird, lasse
ich m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE) weg und
damit das Licht an, wird das Objekt vollständig schwarz gezeichnet.
Weiß vielleicht jemand Rat, wie ich das Modell ordentlich transparent
kriege?
Danke
Norman