Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

C++ FilledRect DirectX9

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

Странные линии вокруг прямоугольника
1675425390312.png

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

Так же отключал антиалиасинг при рендере, но это не давало никакого результата. Использую DX девайс самой игры. Вот код:
Рендер окна:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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));
}
 

Вложения

  • 1675425390312.png
    1675425390312.png
    35.9 KB · Просмотры: 16
/del
Фиксанул. После рендера надо вставить это.

C++:
Expand Collapse Copy
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);
 
Назад
Сверху Снизу