directdraw color keying



  • hallo leute..

    kennt sich jemand mit dem color keying unter directdraw aus?

    bei mir funktioniert das irgendwie nicht..

    ich will dass die farbe weiss (RGB: FFFFFF) nicht dargestellt wird bzw. transparent ist..

    DDCOLORKEY ddck;
        ddck.dwColorSpaceLowValue  = 0xFF;
        ddck.dwColorSpaceHighValue = 0xFF;
    
        if(failed(m_pdds->SetColorKey(DDCKEY_SRCBLT, &ddck)))
    		return DD_FALSE;
    
        return DD_OK;
    

    jedoch wird die weisse fläche meines bitmaps trotzdem dargestellt..



  • niemand da der mir helfen kann?



  • Hi,
    du willst doch bestimmt erreichen, dass eine Textur an einer bestimmten Stelle transparent ist oder nicht?

    Ich hab das immer dadurch erreicht, dass ich direkt bei der Methode D3DXCreateTextureFromFileInMemoryEx den ColorKey als D3DColor angegeben habe, wäre das auch eine Lösung für dein Problem?

    Viele Grüße
    Andreas



  • nein leider, ich mach das ganze über direct draw, und dazu muss ich bei meiner surface die funktion SetColorKey() aufrufen..

    aber irgendwas läuft dabei schief, und ich weiss nicht was..

    aber danke für die antwort 🙂



  • DDCOLORKEY ddck; 
        ddck.dwColorSpaceLowValue  = 0xFFFFFF; // <-
        ddck.dwColorSpaceHighValue = 0xFFFFFF; // <-
    
        if(failed(m_pdds->SetColorKey(DDCKEY_SRCBLT, &ddck))) 
            return DD_FALSE;
    


  • das klappt auch nicht..

    ich zeig mal was ich hab..

    //-----------------------------------------------------------------------------
    // Name: ColorMatch()
    // Desc: 
    //-----------------------------------------------------------------------------
    DWORD Surface::ColorMatch(COLORREF RGB)
    {
        COLORREF rgbT;
        HDC hdc;
        DWORD dw = CLR_INVALID;
        DDSURFACEDESC2 ddsd;
        HRESULT hres;
    
    		//  use GDI SetPixel to color match for us
        if (RGB != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK)
        {
    		rgbT = GetPixel(hdc, 0, 0);             // save current pixel value
    		SetPixel(hdc, 0, 0, RGB);               // set our value
    		m_pdds->ReleaseDC(hdc);
        }
    
    		// now lock the surface so we can read back the converted color
        ddsd.dwSize = sizeof(ddsd);
        while ((hres = m_pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING);
    
        if (hres == DD_OK)
        {
    		dw  = *(DWORD *)ddsd.lpSurface;                     
            if(ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
                dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; 
    		m_pdds->Unlock(NULL);
        }
    
    		//  now put the color that was there back.
        if (RGB != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK)
        {
    		SetPixel(hdc, 0, 0, rgbT);
    		m_pdds->ReleaseDC(hdc);
        }
    
        return dw;
    } // ColorMatch()
    
    //-----------------------------------------------------------------------------
    // Name: SetColorKey()
    // Desc: Sets the color key
    //-----------------------------------------------------------------------------
    HRESULT Surface::SetColorKey(COLORREF RGB)
    {
    	if(NULL == m_pdds)
            return E_POINTER;
    
        m_bColorKeyed = true;
    
    	DDCOLORKEY          ddck;
    
        ddck.dwColorSpaceLowValue  = ColorMatch(RGB);
        ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
    
        if(failed(m_pdds->SetColorKey(DDCKEY_SRCBLT, &ddck)))
    		return DD_FALSE;
    
    	return DD_OK;	
    }	// SetColorKey()
    

    hab die werte überprüft:

    0xFFFFFF = 16777215

    das kommt auch beim debuggen raus.. also "DDCOLORKEY ddck" sollte ok sein..



  • Hi,
    wie bringst du denn dein Bitmap auf dein Surface? Soweit ich mich erinnere, wirkt sich ein Colorkey nur aufs Blitten über dein Surface aus... Falls du dein Bitmap also mit einer eigenen Blt-Methode oder so anzeigst, kann es sein, dass dein Colorkey keinen Effekt zeigt...



  • Ausserdem muss man beim Blt() Aufruf noch das passende Flag mitgeben, sonst wird der Color-Key nicht verwendet.


Anmelden zum Antworten