Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос D3D9 Рендер — Почему рисуются только линии и игнорируются примитивы?

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
505
Реакции
12
Народ, кто плотно сидит на реверсе графики, выручайте. Пишу свою обертку под DirectX 9 (с заделом на будущее), и уперся в стену. Суть в чем: простые линии через ID3DXLines рисуются без проблем, а вот попытка отрисовать обычный прямоугольник или треугольник в хуке заканчивается ничем.

Тестирую всё это дело на классике Source Engine — CS:S и L4D2. Юзаю стандартный хук EndScene. Самое забавное, что в обычном standalone D3D9 приложении код отрабатывает на ура, а внутри игры — тишина. Создание буфера проходит успешно, ошибок нет, но на экране пусто.

Вот как выглядит мой текущий вызов отрисовки прямоугольника:

Код:
Expand Collapse Copy
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 с сырыми массивами — результат нулевой. Сам хук стандартный, просто пробрасываю девайс в свой рендер:

Код:
Expand Collapse Copy
Sudevice = pDevice; 
sudsy::Render(); 
return oEndScene(pDevice);

Мои мысли по теме:
Похоже, что Source Engine засирает стейты девайса перед вызовом. Скорее всего, нужно либо сохранять StateBlock, либо принудительно отключать Z-buffer, свет и прочую лабуду, которая может мешать 2D отрисовке. Плюс есть подозрение на ScissorRect или кривой FVF.

  1. Использовать DrawPrimitiveUP вместо буферов.
  2. Менять флаги в VertexBuffer.
  3. Мучить нейронки (выдают полнейший мусор, который не компилится или не работает).
  4. Проверять HRESULT на каждом шаге — всё возвращает D3D_OK.

Кто сталкивался с капризами старого движка Valve при отрисовке своего интерфейса? Нужно ли тут обязательно вызывать BeginScene/EndScene внутри самого хука, если игра и так их вызывает?

Отпишитесь, кто фиксил подобное.
 
Назад
Сверху Снизу