C++ Вопрос FilledRect DirectX9

Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Добрый день югейм. Решил слезть с иглы ImGui и попробовать себя в рендере меню на DirectX скорее чисто для опыта, да и самому писать иногда приятнее. В общем проблема следующая, есть некоторый код рендера FilledRect, который рендерит практически как надо, но, как в анекдоте, есть нюанс, а именно линии вокруг самого прямоугольника, в 1 пиксель проходит линия которая будто бы имеет 50% альфы от всего цвета ( см. скрин ). В чем может быть проблема ? А так же очень странные точно такие же пустые пиксели по диагонали при бордера и неправильно рендерится левый нижний угол, хотя вспомнив векторную алгебру с 8 класса всё должно быть нормально.
Само окно менюшки
1675425349114.png
Странные линии вокруг прямоугольника
1675425390312.png

Такие же пустые пиксели по диагонали для бордеров
1675425708145.png

Так же отключал антиалиасинг при рендере, но это не давало никакого результата. Использую DX девайс самой игры. Вот код:
Рендер окна:
void CWindow::Render()
{
    HandleMovement();

    // Backgound rect render
    g_pRender->FilledRectangle(m_vec2Pos, m_vec2Size, m_colBackgroundColor);

    // TEST: Borders render
    g_pRender->Rectangle(m_vec2Pos, m_vec2Size, CColor(8, 8, 8));
    g_pRender->Rectangle(m_vec2Pos - CVector2(1, 1), m_vec2Size + CVector2(1, 1), CColor(8, 8, 8));
    g_pRender->Rectangle(m_vec2Pos - CVector2(2, 2), m_vec2Size + CVector2(2, 2), CColor(8, 8, 8));

    // Header
    RenderHeader();
}
FilledRectangle:
void CRender::FilledRectangle(CVector2 vec2Pos, CVector2 vec2Size, CColor colColor)
{
    m_pRenderDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
    const auto toX = vec2Pos.x + vec2Size.x;
    const auto toY = vec2Pos.y + vec2Size.y;
    const auto col = colColor.GetD3D9Color();

    Vertex_t vert[5] =
    {
        { vec2Pos.x, vec2Pos.y, 0.0f, 1.0f, col },
        { toX, vec2Pos.y, 0.0f, 1.0f, col },
        { toX, toY, 0.0f, 1.0f, col },
        { vec2Pos.x, toY, 0.0f, 1.0f, col },
        { vec2Pos.x, vec2Pos.y, 0.0f, 1.0f, col }
    };
    m_pRenderDevice->SetTexture(0, nullptr);
    m_pRenderDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 3, &vert, sizeof(Vertex_t));
}
Rectangle:
void CRender::Rectangle(CVector2 vec2Pos, CVector2 vec2Size, CColor colColor)
{
    const auto toX = vec2Pos.x + vec2Size.x;
    const auto toY = vec2Pos.y + vec2Size.y;
    const auto col = colColor.GetD3D9Color();

    Vertex_t vert[5] =
    {
        { vec2Pos.x, vec2Pos.y, 0.0f, 1.0f, col },
        { toX, vec2Pos.y, 0.0f, 1.0f, col },
        { toX, toY, 0.0f, 1.0f, col },
        { vec2Pos.x, toY, 0.0f, 1.0f, col },
        { vec2Pos.x, vec2Pos.y, 0.0f, 1.0f, col }
    };

    m_pRenderDevice->SetTexture(0, nullptr);
    m_pRenderDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, 4, &vert, sizeof(Vertex_t));
}
 

Вложения

Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
/del
Фиксанул. После рендера надо вставить это.

C++:
D3DRECT rc = { LONG(vec2Pos.x - 1), LONG(vec2Pos.y - 1), LONG(toX + 1), LONG(toY + 1) };
m_pRenderDevice->Clear(1, &rc, D3DCLEAR_TARGET, colColor.GetD3D9Color(), 0.0f, 0);
 
Сверху Снизу