Цвета ухудшаются / смешиваются во время рисования в EndScene

0

Я пытаюсь нарисовать текстуры на экране в игре, которую я зацепил. Проблема в том, что текстуры имеют эти странные контуры.

Например, на следующем рисунке:

Изображение 174551

Предполагается, что это будет выглядеть (нарисовано с использованием D3D9XSprite):

Изображение 174551

Я рисую свои текстуры с помощью:

//Creates a texture from a buffer containing pixels.
void LoadTexture(IDirect3DDevice9* Device, std::uint8_t* buffer, int width, int height, IDirect3DTexture9* &Texture)
{
    Device->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &Texture, 0);

    D3DLOCKED_RECT rect;
    Texture->LockRect(0, &rect, nullptr, D3DLOCK_DISCARD);
    std::uint8_t* TexturePixels = static_cast<std::uint8_t*>(rect.pBits);
    Texture->UnlockRect(0);
    memcpy(TexturePixels, &buffer[0], width * height * 4);
}

//Draws a texture to the screen..
void DrawTexture(IDirect3DDevice9* Device, IDirect3DTexture9* Texture, float X1, float Y1, float X2, float Y2)
{
    D3DVertex vertices[] =
    {
        {X1, Y1, 1.0f, 1.0f, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 0xFF), 0.0f, 0.0f},
        {X2, Y1, 1.0f, 1.0f, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 0xFF), 1.0f, 0.0f},
        {X1, Y2, 1.0f, 1.0f, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 0xFF), 0.0f, 1.0f},
        {X2, Y2, 1.0f, 1.0f, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 0xFF), 1.0f, 1.0f}
    };

    Device->SetFVF(VERTEX_FVF_TEX);
    Device->SetTexture(0, Texture);
    Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertices, sizeof(D3DVertex));
}

//Loads and draws a texture to the screen.
void BltBuffer(IDirect3DDevice9* Device)
{
        LoadTexture(Device, buffer, w, h, Texture);
        DrawTexture(Device, Texture, 0, 0, w, h);
        SafeRelease(Texture);
}


//Hooked EndScene. Draws my texture on the game window.
HRESULT Direct3DDevice9Proxy::EndScene()
{
    IDirect3DStateBlock9* stateblock;
    ptr_Direct3DDevice9->CreateStateBlock(D3DSBT_ALL, &stateblock);
    stateblock->Capture();

    ptr_Direct3DDevice9->SetRenderState(D3DRS_LIGHTING, false);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_ZENABLE, false);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    ptr_Direct3DDevice9->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    BltBuffer(ptr_Direct3DDevice9);

    if (stateblock)
    {
        stateblock->Apply();
        stateblock->Release();
    }
    return ptr_Direct3DDevice9->EndScene();
}

Любые идеи, почему мои цвета деградируют?

Теги:
directx
directx-9

1 ответ

2
Лучший ответ

Вы забываете компенсировать свой квадрат с половинным размером пикселя, чтобы напрямую отображать тексели в пикселях. Без этого смещения рисованная текстура будет размыта, потому что тексель отображает более одного пикселя. Проблема объясняется более подробно при прямом отображении Texels to Pixels (MSDN).

(Ваша проблема равна следующему сообщению Точная наложение текстуры)

  • 0
    +1 Не знал, что это так. Я не был таким в OpenGL, поэтому я был действительно смущен. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню