Gå til innhold

Problem med transparency i direct3D.


Anbefalte innlegg

Jeg driver og arbeider litt med et 2d - direct3D prosjekt, der eg nå har støtt på et lite problem.

 

Jeg har følgende kode for å rendre sprites:

bool GEP_Core::Graphics_RenderSprite( GEP_Sprite sprite )
{
CUSTOMVERTEX vertices[6];

//Fill vertices with data from sprite class.
Graphics_FillVertex( &vertices, &sprite );

//Add vertice data to buffer.
VOID* pVertices;
if( FAILED( pVertexBuffer->Lock( 0, sizeof(vertices), (VOID**)&pVertices, 0 ) ) )
 return false;
memcpy( pVertices, vertices, sizeof(vertices) );
pVertexBuffer->Unlock();

//Recieve texture to use.
LPDIRECT3DTEXTURE9 tex = sprite.GetTexture()->GetTexturePointer();

//Set texture to use, and draw the sprite.
pD3DDevice->SetTexture( 0, tex );
pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );

//Completed successfully.
return true;
}

 

Og følgende kode for å laste textures:

bool GEP_Core::Texture_Load( GEP_Texture *texture, std::string filename )
{
//GEP_Texture texture;
LPDIRECT3DTEXTURE9 tex;	

//Get image info and validate existence.
D3DXIMAGE_INFO imageInfo;
if( FAILED(D3DXGetImageInfoFromFile( filename.c_str(), &imageInfo )) )
 return false;

//Load texture from file.
D3DXCreateTextureFromFileEx( pD3DDevice,
   filename.c_str(),
   imageInfo.Width,
   imageInfo.Height,
   1,
   0,
   D3DFMT_A8R8G8B8,
   D3DPOOL_MANAGED,
   D3DX_DEFAULT,
   D3DX_DEFAULT,
   Settings_GetTransparentColor(),
   NULL,
   NULL,
   &tex);

//Store texture data in texture storage.
texture->SetTextureAreaSize( imageInfo.Width, imageInfo.Height );
texture->SetTexture( tex );

//Completed successfully.
return true;
}

 

Koden her henter data fra sprite klassen, som inneholder all data for spriten som skal rendres, som posisjonering, størrelse, texture som brukes og z-verdi.

 

Problemet jeg da har støtt på er i sammenheng gjennomsiktighet for spritene, og z-verdien, som jeg bruker for å spesifisere top-prioritet for spritene.

 

Hvis jeg først rendrer en sprite med z-verdi 0, altså top-prioritert nærmest skjermen, og deretter rendrer en ny sprite med z-verdi 1, altså lengst vekk fra skjermen på samme posisjon som den første, vil gjennomsiktigheten til den første ikke være gjennomsiktig over den første, men heller vise bakgrunnsfarge.

 

For å prøve å illustrere det, så vil det bli seende slik ut:

___

| 1_|_

|..|.....|

|_|..0..|

...|___|

 

Da det egentlig skulle sett slik noe slikt ut:

___

|..1.|_

|.....|..|

|__|..0|

...|___|

 

Forandrer jeg rekkefølge, og rendrer spriten med z-verdi 1 først, og deretter den med z-verdi 0, oppstår ikke dette problemet.

 

Så problemet mitt i all enkelhet er at når eg rendrer en sprite med z-verdi 1, så klarer den ikke rendre over gjennomsiktighetsfargen til spriten med z-verdi 0, og viser heller gjennomsiktighetsfargen over spriten med z-verdi 1.

 

 

 

Håper det er noen der ute som klarer forstå hva jeg mener, og at noen sitter med svaret på hvorfor dette skjer.

Endret av _TT_
Lenke til kommentar
Videoannonse
Annonse

La oss si at du skal rendre en kule som ligger over et bord.

Og du sender kule til rendring først så vil du jo ikke at border skal overdekkes av bordet (i de fleste tilfeller)

Derfor finnes Z-buffer

Z-buffer lagrer "dybden" på alle fragmenter (pixler) du rendrer.

Og under normal kjøring så vil skjermkortet skjekke om den pixlen du rendrer et høyere (tror det er høyere)

altså nærmere og hvis den er nærmere så blir fragmentet som originalt var der overskrivd.

Så når du rendrer front to back så vil bare den fremste vises siden alle de andre blir avist forde de har lavere

verdi i z-bufferen enn den fremste blokken.

Det er sikker mulig å skru av z-buffer skjekken i d3d (går fint i OGL) , men resultatet blir feil.

Så du må nødt til å skjekke hva som ligger øverst og rendre det til sist.

Så ikke gjennomsiktige skal rendres front to back, men gjennomsiktige skal rendres back to front.

Det er noe som heter order independent transparency, men det vet jeg for lite om og kan så vidt jeg vet bare gjøres i shadere.

Lenke til kommentar

Riktig det som Giddion sier, rekkefølgen på de transparente spritene er viktig. Så regelen er å få d3d til å tegne helfargede sprites først, og deretter sortere og rendre de transparente i dybde-orden, dvs. bak til front. Det fikser nok saken.

 

Hmm.. order independent transparency har jeg ikke testet heller.. får lese litt.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...