Kopieren von D3DFMT_X8R8G8B8 in D3DFMT_A8



  • Ich frage mich gerade, wie man möglichst effizient ein 32-Bit Surface in ein 8-Bit Surface konvertieren kann.

    1. D3DXLoadSurfaceFromSurface oder UpdateSurface kann ich IMHO nicht benutzen, weil eben die Farbformate nicht übereinstimmen?
    2. Möglicherweise wäre es schneller, das Destination als Rendertarget zu bestimmen und Source als Texture und das Ganze zu rendern?
    3. Ich frage mich in diesem Zusammenhang auch gerade, wie schlimm wohl der reinterpret_cast innerhalb der äusseren Schleife ist? Hat der überhaupt einen Nachteil, eigentlich muss ja nichts konvertiert werden, dem Kompiler wird doch damit in diesem Fall bloss ein Hinweis zur relativen Speicheraddressierung gegeben?

    LockedRect rcSrc,rcDst;
    srfSrc->LockRect(&rcSrc,0x00,D3DLOCK_READONLY);
    srfDst->LockRect(&rcDst,0x00,0);
    
    // start a loop for walking each row
    for(uint32 i=0;i<szTex;++i){
     // convert the pointer into 8-bit pointers
     uint8 *pSrc = reinterpret_cast<uint8*>(rcSrc.pBits)+rcSrc.Pitch*i;
     uint8 *pDst = reinterpret_cast<uint8*>(rcDst.pBits)+rcDst.Pitch*i;
    
     // copy the current pixel from the source to the destination surface
     // (the source surface uses 4 bytes per pixel, the destination surface only 1 byte)
     for(uint32 k=0;k<szTex;++k) pDst[k] = pSrc[4*k];
    }
    
    srfDst->UnlockRect();
    srfSrc->UnlockRect();
    

    Für eure Antworten und Hinweise bin ich sehr dankbar. Ich arbeite gerade an unserer Bachelorarbeit und es ist mir ein grosses Anliegen, wirklich zu verstehen, was ich da mache 😉

    Mfg Samuel



  • Ishildur schrieb:

    wie man möglichst effizient ein 32-Bit Surface in ein 8-Bit Surface konvertieren kann.

    BitBlt, IDirect3DSurface9::GetDC.



  • @hellihjb
    Soweit ich weiss ist eben GetDC nur mit folgenden Formaten gültig:
    D3DFMT_R5G6B5, D3DFMT_X1R5G5B5, D3DFMT_R8G8B8, and D3DFMT_X8R8G8B8, D3DFMT_A8 ist also IMHO ungültig.
    Soweit ich weiss, funktioniert BitBlt nicht, wenn ich aus dem einen Surface wie hier lediglich jedes 4 byte herauspflücken muss.



  • Ahja, steht ja auch da 😉
    Warum willst Du ueberhaupt konvertieren?



  • Naja, ich muss mit dem GDI in eine Alphamap zeichnen. Weil dies ja aber aufgrund der Einschränkungen von GetDC nicht möglch ist, generiere ich ein OffScreenPlainSurface mit D3DFMT_X8R8G8B8 und zeichne mit dem GDI in dieses hinein. Schliesslich übertrage ich die Daten wie in dem Codeabschnitt beschrieben in eine Texture mit dem Format D3DFMT_A8. Es funktioniert auch super, ich frage mich nur, ob mein Ansatz der richtige ist 🙂



  • Da nur du wissen kannst, wie denn deine Formate implementiert werden sollen, denke ich schon, das dieses haendische kopieren der einzig moegliche Weg ist. Schneller wuerde hoechstens gehen, das du es die Grafikkarte machen laesst und die Konvertierung dann in einem Pixelshader erfolgt. f'`8k

    Gruß, TGGC (Was Gamestar sagt...)


Log in to reply