Direct3D9 Рендеринг Отверстий в Объекте - PullRequest
0 голосов
/ 22 декабря 2019

поэтому я делаю что-то, что рисует прямоугольник в зависимости от местоположения, которое они предоставляютТаким образом, если они дают определенный шнур экрана (например, 50, 100), он рисует прямоугольник там. Тем не менее, я сталкиваюсь с небольшой проблемой. Прямоугольник отображается в правильном месте, но с небольшими отверстиями. Я пошел вперед и нарисовал кучу прямоугольников, чтобы показать вам, ребята, о чем я. Кто-нибудь знает, почему это происходит?

#include <DirectXDraw.h>

#pragma warning(disable:4244)

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer;
D3DVIEWPORT9 d3dvp9;

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)


struct CUSTOMVERTEX
{
    float x, y, z, rhw;
    uintptr_t color;
};

void InitD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = true;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;

    d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

    if (hWnd == NULL)
    {
        std::cout << "hWnd is NULL";
    }
}

void GetResolution(int &width, int &height)
{
    d3ddev->GetViewport(&d3dvp9);

    width = d3dvp9.Width;
    height = d3dvp9.Height;
}

void Draw(int x, int y, int width, int height, bool draw)
{
    CUSTOMVERTEX OurVertices[] =
    {
        {x, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)},  // top left
        {x, y + height, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)},  // bottom left
        {x + width, y + height, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // bottom right
        {x + width, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // top right
        {x, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)},
        {x, y, 1.0f, 1.0f, D3DCOLOR_ARGB(0, 0, 0, 0)},
    };

    d3ddev->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &v_buffer, NULL);

    void* pVoid;

    v_buffer->Lock(0, 0, &pVoid, NULL);

    memcpy(pVoid, OurVertices, sizeof(OurVertices));

    v_buffer->Unlock();

    Render_Frame(draw);
}

void Render_Frame(bool draw)
{
    if (draw == true)
    {
        d3ddev->Present(NULL, NULL, NULL, NULL);

        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, NULL, 1.0f, 0);
    }
    else
    {
        d3ddev->BeginScene();


        d3ddev->SetFVF(CUSTOMFVF);
        // Rectangle
        d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
        d3ddev->DrawPrimitive(D3DPT_LINESTRIP, 0, 6);
        // Vertex
        d3ddev->DrawPrimitive(D3DPT_POINTLIST, 0, 1);


        d3ddev->EndScene();
    }
}

void CleanD3D()
{
    v_buffer->Release();
    d3d->Release();
    d3ddev->Release();
}

Screenshot

...