• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

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

  • Автор темы Автор темы Vine
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции
6
Здравствуйте.
Делаю ESP для Team Fortress 2.
Хук EndScene(Present) и Reset готов, основное меню решил сделать на имгуи, меню на имгуи рисуется нормально.
Проблемы возникают с отрисовками линий с помощью чистого DirectX.
Гугл дал три разных варианта отрисовки линий:
C++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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?
Спасибо!
 
Здравствуйте.
Делаю ESP для Team Fortress 2.
Хук EndScene(Present) и Reset готов, основное меню решил сделать на имгуи, меню на имгуи рисуется нормально.
Проблемы возникают с отрисовками линий с помощью чистого DirectX.
Гугл дал три разных варианта отрисовки линий:
C++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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++:
Expand Collapse Copy
    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
 
Назад
Сверху Снизу