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:
laden der SpriteTexture:
das rendern:
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?
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?