Я пытаюсь нарисовать текстуры на экране в игре, которую я зацепил. Проблема в том, что текстуры имеют эти странные контуры.
Например, на следующем рисунке:
Предполагается, что это будет выглядеть (нарисовано с использованием D3D9XSprite):
Я рисую свои текстуры с помощью:
//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();
}
Любые идеи, почему мои цвета деградируют?
Вы забываете компенсировать свой квадрат с половинным размером пикселя, чтобы напрямую отображать тексели в пикселях. Без этого смещения рисованная текстура будет размыта, потому что тексель отображает более одного пикселя. Проблема объясняется более подробно при прямом отображении Texels to Pixels (MSDN).
(Ваша проблема равна следующему сообщению Точная наложение текстуры)