-
Автор темы
- #1
Здравствуйте.
Делаю ESP для Team Fortress 2.
Хук EndScene(Present) и Reset готов, основное меню решил сделать на имгуи, меню на имгуи рисуется нормально.
Проблемы возникают с отрисовками линий с помощью чистого DirectX.
Гугл дал три разных варианта отрисовки линий:
Последний вариант работает, линию рисует, но появляются другие проблемы с ним.
При использовании метода ID3DXLine::Begin восстанавливливается виртуальная таблица d3d девайса, и, самое непонятное, происходит краш если перестать рисовать линию.
Я смирился, и решил использовать первые два метода.
В пустом проекте с DirectX эти все методы работают, линии рисуются, но в игре почему-то нет.
Сначала я грешил на то, что в игре отрисовка происходит после EndScene(при хуке Present), сделал хук на EndScene - не помогло.
Еще есть много разных необъяснимых вещей, даже в пустом проекте с DirectX.
Например, этот код не отрисует ни одну из линий(отрисовка вторым и третим методом):
Что в этом случае не так? Линии рисуются после вызова EndScene.
Все бы ничего, но, если хоть отрисовку хоть одной из линий вызвать до EndScene, то отрисуются все линии, даже те, которые отрисовываются после EndScene.
Кто может помочь и подсказать, почему линии в игре не отрисовываются, как в пустом проекте с DirectX?
Спасибо!
Делаю 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.
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);
Спасибо!