Проблема с отрисовками линий DirectX в Team Fortress 2

Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Здравствуйте.
Делаю ESP для Team Fortress 2.
Хук EndScene(Present) и Reset готов, основное меню решил сделать на имгуи, меню на имгуи рисуется нормально.
Проблемы возникают с отрисовками линий с помощью чистого DirectX.
Гугл дал три разных варианта отрисовки линий:
C++:
    SD3DVertex pVertex[2] = {
        { (float)x1, (float)y1, 1.0f, 1.0f, color },
        { (float)x2, (float)y2, 1.0f, 1.0f, color }
    };
    pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
    pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 2, &pVertex, sizeof(SD3DVertex));
C++:
    SD3DVertex pVertex[2] = {
    { (float)x1, (float)y1, 1.0f, 1.0f, color },
    { (float)x2, (float)y2, 1.0f, 1.0f, color }
    };
    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(pD3DDevice->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        pD3DDevice->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 1);
    }
C++:
    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();
Последний вариант работает, линию рисует, но появляются другие проблемы с ним.
При использовании метода ID3DXLine::Begin восстанавливливается виртуальная таблица d3d девайса, и, самое непонятное, происходит краш если перестать рисовать линию.

Я смирился, и решил использовать первые два метода.
В пустом проекте с DirectX эти все методы работают, линии рисуются, но в игре почему-то нет.
Сначала я грешил на то, что в игре отрисовка происходит после EndScene(при хуке Present), сделал хук на EndScene - не помогло.
Еще есть много разных необъяснимых вещей, даже в пустом проекте с DirectX.
Например, этот код не отрисует ни одну из линий(отрисовка вторым и третим методом):
C++:
    d3ddev->BeginScene();

    d3ddev->EndScene();
    SD3DVertex pVertex[2] = {
        { (float)100, (float)100, 9.0f, 9.0f, 0xFFFFFFFF },
        { (float)200, (float)600, 1.0f, 1.0f, 0xFFFFFFFF }
    };

    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(d3ddev->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        d3ddev->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        d3ddev->DrawPrimitive(D3DPT_LINELIST, 0, 4);
    }

    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();


    d3ddev->Present(NULL, NULL, NULL, NULL);
Что в этом случае не так? Линии рисуются после вызова EndScene.
Все бы ничего, но, если хоть отрисовку хоть одной из линий вызвать до EndScene, то отрисуются все линии, даже те, которые отрисовываются после EndScene.
C++:
    d3ddev->BeginScene();

    SD3DVertex pVertex[2] = {
    { (float)100, (float)100, 9.0f, 9.0f, 0xFFFFFFFF },
    { (float)200, (float)600, 1.0f, 1.0f, 0xFFFFFFFF }
    };

    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(d3ddev->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        d3ddev->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        d3ddev->DrawPrimitive(D3DPT_LINELIST, 0, 4);
    }

    d3ddev->EndScene();

    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();


    d3ddev->Present(NULL, NULL, NULL, NULL);
Кто может помочь и подсказать, почему линии в игре не отрисовываются, как в пустом проекте с DirectX?
Спасибо!
 
Пользователь
Статус
Оффлайн
Регистрация
4 Июн 2018
Сообщения
329
Реакции[?]
94
Поинты[?]
3K
Здравствуйте.
Делаю ESP для Team Fortress 2.
Хук EndScene(Present) и Reset готов, основное меню решил сделать на имгуи, меню на имгуи рисуется нормально.
Проблемы возникают с отрисовками линий с помощью чистого DirectX.
Гугл дал три разных варианта отрисовки линий:
C++:
    SD3DVertex pVertex[2] = {
        { (float)x1, (float)y1, 1.0f, 1.0f, color },
        { (float)x2, (float)y2, 1.0f, 1.0f, color }
    };
    pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
    pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 2, &pVertex, sizeof(SD3DVertex));
C++:
    SD3DVertex pVertex[2] = {
    { (float)x1, (float)y1, 1.0f, 1.0f, color },
    { (float)x2, (float)y2, 1.0f, 1.0f, color }
    };
    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(pD3DDevice->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        pD3DDevice->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 1);
    }
C++:
    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();
Последний вариант работает, линию рисует, но появляются другие проблемы с ним.
При использовании метода ID3DXLine::Begin восстанавливливается виртуальная таблица d3d девайса, и, самое непонятное, происходит краш если перестать рисовать линию.

Я смирился, и решил использовать первые два метода.
В пустом проекте с DirectX эти все методы работают, линии рисуются, но в игре почему-то нет.
Сначала я грешил на то, что в игре отрисовка происходит после EndScene(при хуке Present), сделал хук на EndScene - не помогло.
Еще есть много разных необъяснимых вещей, даже в пустом проекте с DirectX.
Например, этот код не отрисует ни одну из линий(отрисовка вторым и третим методом):
C++:
    d3ddev->BeginScene();

    d3ddev->EndScene();
    SD3DVertex pVertex[2] = {
        { (float)100, (float)100, 9.0f, 9.0f, 0xFFFFFFFF },
        { (float)200, (float)600, 1.0f, 1.0f, 0xFFFFFFFF }
    };

    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(d3ddev->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        d3ddev->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        d3ddev->DrawPrimitive(D3DPT_LINELIST, 0, 4);
    }

    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();


    d3ddev->Present(NULL, NULL, NULL, NULL);
Что в этом случае не так? Линии рисуются после вызова EndScene.
Все бы ничего, но, если хоть отрисовку хоть одной из линий вызвать до EndScene, то отрисуются все линии, даже те, которые отрисовываются после EndScene.
C++:
    d3ddev->BeginScene();

    SD3DVertex pVertex[2] = {
    { (float)100, (float)100, 9.0f, 9.0f, 0xFFFFFFFF },
    { (float)200, (float)600, 1.0f, 1.0f, 0xFFFFFFFF }
    };

    IDirect3DVertexBuffer9*        pD3DVertexBuffer = nullptr;
    if (SUCCEEDED(d3ddev->CreateVertexBuffer(sizeof(pVertex), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &pD3DVertexBuffer, 0))) {
        LPVOID lpVertexLock = nullptr;
        pD3DVertexBuffer->Lock(0, 0, &lpVertexLock, 0);
        memcpy(lpVertexLock, pVertex, sizeof(pVertex));
        pD3DVertexBuffer->Unlock();

        d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        d3ddev->SetStreamSource(0, pD3DVertexBuffer, 0, sizeof(SD3DVertex));
        d3ddev->DrawPrimitive(D3DPT_LINELIST, 0, 4);
    }

    d3ddev->EndScene();

    ID3DXLine *line;
    D3DXVECTOR2 point[] = {
        {100, 100},
        {300, 300}
    };
    D3DXCreateLine(d3ddev, &line);
    line->SetWidth(10);
    line->Begin();
    line->Draw(point, 2, 0xFF00FF00);
    line->End();
    line->Release();


    d3ddev->Present(NULL, NULL, NULL, NULL);
Кто может помочь и подсказать, почему линии в игре не отрисовываются, как в пустом проекте с DirectX?
Спасибо!
Рисуй через ISurface
 
Сверху Снизу