- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 505
- Реакции
- 12
Народ, кто плотно сидит на реверсе графики, выручайте. Пишу свою обертку под DirectX 9 (с заделом на будущее), и уперся в стену. Суть в чем: простые линии через ID3DXLines рисуются без проблем, а вот попытка отрисовать обычный прямоугольник или треугольник в хуке заканчивается ничем.
Тестирую всё это дело на классике Source Engine — CS:S и L4D2. Юзаю стандартный хук EndScene. Самое забавное, что в обычном standalone D3D9 приложении код отрабатывает на ура, а внутри игры — тишина. Создание буфера проходит успешно, ошибок нет, но на экране пусто.
Вот как выглядит мой текущий вызов отрисовки прямоугольника:
Пробовал и DrawPrimitiveUP с сырыми массивами — результат нулевой. Сам хук стандартный, просто пробрасываю девайс в свой рендер:
Мои мысли по теме:
Похоже, что Source Engine засирает стейты девайса перед вызовом. Скорее всего, нужно либо сохранять StateBlock, либо принудительно отключать Z-buffer, свет и прочую лабуду, которая может мешать 2D отрисовке. Плюс есть подозрение на ScissorRect или кривой FVF.
Кто сталкивался с капризами старого движка Valve при отрисовке своего интерфейса? Нужно ли тут обязательно вызывать BeginScene/EndScene внутри самого хука, если игра и так их вызывает?
Отпишитесь, кто фиксил подобное.
Тестирую всё это дело на классике Source Engine — CS:S и L4D2. Юзаю стандартный хук EndScene. Самое забавное, что в обычном standalone D3D9 приложении код отрабатывает на ура, а внутри игры — тишина. Создание буфера проходит успешно, ошибок нет, но на экране пусто.
Вот как выглядит мой текущий вызов отрисовки прямоугольника:
Код:
if (!Valid()) { return; }
if (!d3ddev) { return; }
LPDIRECT3DVERTEXBUFFER9 vBuffer;
_VTX OurVertices[] =
{
{ 0, 0, 0, 1.0f, D3DCOLOR_ARGB(255,255,0,0)},
{ 640, 0, 0, 1.0f, D3DCOLOR_ARGB(255,0,255,0) },
{ 0, 480, 0, 1.0f, D3DCOLOR_ARGB(255,0,0,255) },
{ 640, 480, 0, 1.0f, D3DCOLOR_ARGB(255,127,127,127) }
};
d3ddev->CreateVertexBuffer(4 * sizeof(_VTX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&vBuffer,
NULL);
VOID* pVoid;
vBuffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, OurVertices, sizeof(OurVertices));
vBuffer->Unlock();
d3ddev->SetFVF(CUSTOMFVF);
d3ddev->SetStreamSource(0, vBuffer, 0, sizeof(_VTX));
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
vBuffer->Release();
Пробовал и DrawPrimitiveUP с сырыми массивами — результат нулевой. Сам хук стандартный, просто пробрасываю девайс в свой рендер:
Код:
Sudevice = pDevice;
sudsy::Render();
return oEndScene(pDevice);
Мои мысли по теме:
Похоже, что Source Engine засирает стейты девайса перед вызовом. Скорее всего, нужно либо сохранять StateBlock, либо принудительно отключать Z-buffer, свет и прочую лабуду, которая может мешать 2D отрисовке. Плюс есть подозрение на ScissorRect или кривой FVF.
- Использовать DrawPrimitiveUP вместо буферов.
- Менять флаги в VertexBuffer.
- Мучить нейронки (выдают полнейший мусор, который не компилится или не работает).
- Проверять HRESULT на каждом шаге — всё возвращает D3D_OK.
Кто сталкивался с капризами старого движка Valve при отрисовке своего интерфейса? Нужно ли тут обязательно вызывать BeginScene/EndScene внутри самого хука, если игра и так их вызывает?
Отпишитесь, кто фиксил подобное.