C++ DirectX: Sprite mit Alpha rendern

Micha1701

Cadet 4th Year
Registriert
März 2007
Beiträge
113
Hallo zusammen,

ich versuche mich gerade an meinem ersten DirectX Programm in C/C++ und stoße gerade auf ein Problem. Und zwar versuche ich ein Bild mit AlphaKanal (BMP - A8R8G8B8 oder auch PNG) als Sprite zu rendern. Leider wird der AlphaKanal dabei noch ignoriert.
Die Bilder hab ich mal angehangen, vielleicht liegts ja auch an denen. Hab die mit GIMP erstellt. Transparenter Hintergrund und beim Speichern das Format A8R8G8B8 angegeben. Das PNG wird im Browser korrekt angezeigt, das BMP nicht. Wobei ich davon ausgehe, daß der Alphakanal des BMPs nicht im Browser ausgewertet wird...

Hier mal ein paar CodeSchnipsel...

erstellen der Devices:
Code:
    d3d = Direct3DCreate9(D3D_SDK_VERSION)))

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.Windowed = false;
    d3dpp.BackBufferWidth = 1024;
    d3dpp.BackBufferHeight = 768;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                                D3DDEVTYPE_HAL,
                                gw->hWnd,
                                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                &d3dpp,
                                &d3ddev)))

    D3DXCreateSprite(d3ddev, &d3dspt);

    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); 
    d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE); 
    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
    d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

laden der SpriteTexture:
Code:
void LoadSprite(SPRITE* pSprite, LPCTSTR File, int width, int height)
{
    D3DXCreateTextureFromFileEx(d3ddev,
                                File,
                                D3DX_DEFAULT,
                                D3DX_DEFAULT,
                                D3DX_DEFAULT,
                                NULL,
                                D3DFMT_A8R8G8B8,
                                D3DPOOL_MANAGED,
                                D3DX_DEFAULT,
                                D3DX_DEFAULT,
                                D3DCOLOR_ARGB(255, 255, 0, 255),
                                NULL,
                                NULL,
                                &pSprite->tex);

    pSprite->width = width;
    pSprite->height = height;

    return;
}

das rendern:
Code:
    //rendern starten
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->BeginScene();
    d3dspt->Begin(D3DXSPRITE_ALPHABLEND);

    //hier wird gerendert...
    RECT FrameBox;
    FrameBox.left = 0;
    FrameBox.top = 0;
    FrameBox.right = pSprite->width;
    FrameBox.bottom = pSprite->height;

    D3DXVECTOR3 position(0, 0, 0);
	
    d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    d3dspt->Draw(pSprite->tex, &FrameBox, NULL, &position, D3DCOLOR_ARGB(255, r, g, b));
    d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

    //Rendern beenden
    d3dspt->End();
    d3ddev->EndScene();
    d3ddev->Present(NULL, NULL, NULL, NULL);

Wie gesagt, bringts das irgendwie nicht. Hab auch schon im MSDN nachgesehen, aber leider nichts gefunden was mit weiterhelfen konnte. Google spart sich hierüber auch ein wenig aus und in den Tutorials die ich habe (Buch und Online) find ich darüber auch nichts...

Jemand ne Ahnung was ich noch einstellen muß, oder was ich falsch gemacht habe?
Oder weiß jemand vielleicht in welchem anderem Forum ich die Frage besser stellen sollte?
 

Anhänge

  • StartGame-Text.png
    StartGame-Text.png
    2,6 KB · Aufrufe: 189
  • Untitled.bmp
    Untitled.bmp
    64,1 KB · Aufrufe: 221
Hallo zusammen,

anscheinend konnte mir keiner helfen, aber ich habs jetzt auch so geschafft. Ein bischen rumprobiert und nun gehts.

hier der geänderte Rendercode (falls es jemanden interessiert):
Code:
    //rendern starten
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->BeginScene();
    d3dspt->Begin(D3DXSPRITE_ALPHABLEND);

    //hier wird gerendert...
    RECT FrameBox;
    FrameBox.left = 0;
    FrameBox.top = 0;
    FrameBox.right = pSprite->width;
    FrameBox.bottom = pSprite->height;

    D3DXVECTOR3 position(0, 0, 0);
	
    d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
//    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    d3dspt->Draw(pSprite->tex, &FrameBox, NULL, &position, D3DCOLOR_ARGB(255, r, g, b));
    d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
//    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

    //Rendern beenden
    d3dspt->End();
    d3ddev->EndScene();
    d3ddev->Present(NULL, NULL, NULL, NULL);
Hier hab ich die beiden Zeilen mit dem "d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, XXX);" auskommentiert. Dann klappts auch mit dem AlphaKanal...
 
Zurück
Oben