2014-01-24 6 views
1

Как я могу получить Direct-X для рисования каждого цвета, кроме черного? В настоящее время я использую следующий код для загрузки и рисования текстур:Игнорировать цвет при рисовании

void LoadTexture(IDirect3DDevice9* Device, unsigned char* buffer, int width, int height, IDirect3DTexture9* &Texture, ID3DXSprite* &Sprite) 
{ 
    Device->CreateTexture(width, height, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &Texture, 0); 
    D3DXCreateSprite(Device, &Sprite); 

    D3DLOCKED_RECT rect; 
    Texture->LockRect(0, &rect, nullptr, D3DLOCK_DISCARD); 
    TexturePixels = static_cast<unsigned char*>(rect.pBits); 
    Texture->UnlockRect(0); 

    memcpy(TexturePixels, &buffer[0], width * height * 4); 
} 

void DrawTextureSprite(IDirect3DDevice9* Device, IDirect3DTexture9* Texture, ID3DXSprite* Sprite) 
{ 
    if (Sprite && Texture) 
    {  
     D3DXVECTOR3 Position = D3DXVECTOR3(0, 0, 0); 
     Sprite->Begin(D3DXSPRITE_ALPHABLEND); 
     Sprite->Draw(Texture, nullptr, nullptr, &Position, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 0xFF)); //0xFFFFFFFF - white.. 
     Sprite->End(); 
    } 
} 

void BltBuffer(IDirect3DDevice9* Device) 
{ 
    if (Bitmap != nullptr) 
    { 
     std::uint8_t* Ptr = Bitmap->pixels; 
     for (int I = 0; I < Bitmap->height; ++I) 
     { 
      for (int J = 0; J < Bitmap->width; ++J) 
      { 
       std::uint8_t B = *(Ptr++); 
       std::uint8_t G = *(Ptr++); 
       std::uint8_t R = *(Ptr++); 
       *(Ptr++) = (B == 0 && G == 0 && R == 0) ? 0 : 0xFF; //if the colour is black, set the alpha channel to 0x0. 
      } 
     } 

     //if (!Texture && !TexturePixels) 
     { 
      LoadTexture(Device, Bitmap->pixels, Bitmap->width, Bitmap->height, Texture, Sprite); 
     } 

     DrawTextureSprite(Device, Texture, Sprite); 
     SafeRelease(Texture); 
     SafeRelease(Sprite); 
    } 
} 

Каждый кадр я называю BlitBuffer и я передать его мое устройство. Однако, когда он рисует, он рисует мои черные пиксели, даже если я установил их альфа-канал в 0. Все остальные пиксели имеют свои альфа-каналы, равные 255.

Любые идеи, как я могу сделать это НЕ рисовать черные пиксели?

ответ

1

вы должны включить и настроить режим смешивания, а

 d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
    d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); 
+1

+1 от меня. Не только это, но и мне пришлось изменить формат 'my' текстуры:' D3DFMT_A8R8G8B8'. Это, безусловно, помогло. Я потратил последний час на включение и выключение альфа-смеси, и как только вы разместили это, я увидел, что мой формат был неправильным. – Brandon