Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
novice07
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
1

Отрисовка примитивов в чужом приложении d3d9

20.07.2017, 21:58. Просмотров 1351. Ответов 5

Всем доброго времени суток! Есть задача вывести примитив в чужом приложении. Хук работает прекрасно, все отрисовывается, но только не примитив. Прошу правок в мой листинг отрисовки примитива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    
Vertex3D Triangle[] = 
    {
        { 10.0f, 10.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 120.0f, 10.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 120.0f, 120.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 10.0f, 120.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) }
    };
    LPDIRECT3DVERTEXBUFFER9 vBuf = NULL;
    void* Verts = NULL;
    dev->CreateVertexBuffer(sizeof(Triangle), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vBuf, 0);
    vBuf->Lock(0, 0, &Verts, 0);
    memcpy(Verts, Triangle, sizeof(Triangle));
    vBuf->Unlock();
    dev->SetStreamSource(0, vBuf, 0,  sizeof(Vertex3D));
    dev->SetFVF(D3DFVF_CUSTOMVERTEX);
    dev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 1);
Структура Vertex3D:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Vertex3D
{
    Vertex3D() { }
    Vertex3D(float x, float y, float z,/* float w,*/ DWORD color)
    {
        X = x;
        Y = y;
        Z = z;
        //W = w;
        Color = color;
    }
    float X;
    float Y;
    float Z;
    //float W;
    DWORD Color;
};
Определение D3DFVF_CUSTOMVERTEX:

C++
1
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
Present вызывал, тоже не помогло. Быть может есть ссылка на теорию по этому поводу?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2017, 21:58
Ответы с готовыми решениями:

Простейшая графика в C++: системы координат, отрисовка примитивов
Добрый день. Интересует, как решать на C++ достаточно тривиальные задачи, к примеру, рисовка...

Отрисовка примитивов в чужом приложении d3d9
Всем доброго времени суток! Есть задача вывести примитив в чужом приложении. Хук работает...

Реализовать хук на D3D9 (DirectX9), чтобы выводить сообщения в чужом окне (игре)
Здравствуйте уважаемые гуру дотНЕТа. Помогите плиз. Хочу реализовать хук на D3D9 (DirectX9),...

Отрисовка примитивов PictureBox
Здравствуйте! Нужда заставила разобраться с принципом рисования элементарных примитивов двумерного...

Отрисовка большого количества примитивов
Требуется отрисовать в WPF некоторое количество прямоугольников, с заданными высотой и шириной и...

5
nonedark2008
1247 / 925 / 280
Регистрация: 28.07.2012
Сообщений: 2,562
20.07.2017, 23:39 2
novice07,
1) Проверь возвращаемые значения каждого из вызванных методов.
2) Проверь отладочный вывод от DirectX.

Добавлено через 5 минут
Цитата Сообщение от novice07 Посмотреть сообщение
Хук работает прекрасно, все отрисовываетс
Что подразумевается под всем? Может у твоего примитива нормали не в ту сторону торчат, и поэтому он не отображается?
0
novice07
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 00:35  [ТС] 3
Подразумевается то, что присутствует вывод текста и своеобразное построение квадрата через метод Clear. Текст выводится и нормально проходит Clear
C++
1
2
3
4
5
6
7
    Log->Write("CreateVertexBuffer returns %x", dev->CreateVertexBuffer(sizeof(Triangle), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vBuf, 0));
    Log->Write("Lock returns %x", vBuf->Lock(0, 0, &Verts, 0));
    memcpy(Verts, Triangle, sizeof(Triangle));
    Log->Write("Unlock returns %x", vBuf->Unlock());
    Log->Write("SetStreamSrc returns %x", dev->SetStreamSource(0, vBuf, 0, sizeof(Vertex3D)));
    Log->Write("SetFVF returns %x", dev->SetFVF(D3DFVF_CUSTOMVERTEX));
    Log->Write("DrawPrimitive returns %x", dev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 1));
Данные из лога:

[01:27:31] CreateVertexBuffer returns 0

[01:27:31] Lock returns 0

[01:27:31] Unlock returns 0

[01:27:31] SetStreamSrc returns 0

[01:27:31] SetFVF returns 0

[01:27:31] DrawPrimitive returns 0

Скрин:
0
Миниатюры
Отрисовка примитивов в чужом приложении d3d9  
novice07
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 01:00  [ТС] 4
Ах да, забыл сказать, что запускал это в GTA:SA. Результат был - черный экран, на нем красный прямоугольник. На момент проскакивает картинка меню. На ощупь запустил игру и все было нормально, только прямоугольник пропадал каждые 8-10 секунд где-то на такое же или меньшее кол-во времени.

Порядок вызова хука:
C++
1
2
3
    
Log->Write("(Main) Адрес EndScene: %X", DirectHook::GetEndScene());
Log->Write("(Main) Ставим хук на EndScene..."); DirectHook::SetHookUp();
Хукаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DWORD DirectHook::GetEndScene()
{
    DWORD Module = (DWORD)GetModuleHandleA("d3d9.dll");
    DWORD tmp = FindPattern(Module , 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
    DWORD* device;
    memcpy(&device, (void*)(tmp + 2), 4);
    oEndScene = (EndScene)device[42];
    return device[42];
}
 
void DirectHook::SetHookUp()
{
    /* oEndScene хранит указатель на EndScene */
    /* Берем и затираем первые пять байт на прыжок к нам в функцию */
    /* При этом сохраняем пять затертых байт */
    byte* t = (byte*)oEndScene;
    for (int i = 0; i < 5; i++)
        OldByte[i] = *(t + i);//Сохранили пять байт
    DWORD AddrToJmp = (DWORD)nEndScene - (DWORD)oEndScene - 5;
    DWORD s;
    VirtualProtect(t, 8, PAGE_EXECUTE_READWRITE, &s);
    t[0] = 0xE9;//JMP
    *((DWORD*)(t + 1)) = AddrToJmp;
    VirtualProtect(t, 8, s, &s);
}
 
HRESULT WINAPI DirectHook::nEndScene(LPDIRECT3DDEVICE9 dev)
{
    UsersGraphic(dev);
    byte* t = (byte*)oEndScene;
    DWORD s;
    VirtualProtect(t, 8, PAGE_EXECUTE_READWRITE, &s);
    for (int i = 0; i < 5; i++)
        t[i] = OldByte[i];
    VirtualProtect(t, 8, s, &s);
    HRESULT hr = oEndScene(dev);
    SetHookUp();
    return hr;
}
0
nonedark2008
1247 / 925 / 280
Регистрация: 28.07.2012
Сообщений: 2,562
21.07.2017, 23:15 5
Лучший ответ Сообщение было отмечено novice07 как решение

Решение

novice07, хмм. А учел ли ты при отрисовке наличие различных матричных преобразований над координатами?
Твой объект может запросто оказаться за пределами области видимости.
1
novice07
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 23:36  [ТС] 6
Да, теперь учел, вопрос закрыт, спасибо.
0
21.07.2017, 23:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2017, 23:36

Отрисовка графических примитивов QPainter
Всем привет! Помогите решить проблему, надо нарисовать такой рисунок. Пока сделал вот что, но ума...

Рисование в чужом полноэкранном приложении
Есть игра, запущенная на весь экран. Надо нарисовать некий текст в углу экрана, возможно ли это...

Нажать кнопку в чужом приложении
Помогите нажать кнопку на &quot;левом&quot; приложение !!!!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru