Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Norman0406

Frischling

  • »Norman0406« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Koblenz

Beruf: Student

  • Private Nachricht senden

1

06.04.2007, 16:20

Alpha-Blending klappt nicht

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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.04.2007, 16:46

:arrow: http://www.c-plusplus.de/forum/viewtopic-var-t-is-177987.html