C++ DXEngine | Облегченный код directx11

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
19 Янв 2024
Сообщения
145
Реакции
5
DXEngine — компактный и лёгкий движок, написанный на C++ с использованием DirectX 11. Он предназначен для быстрого создания оконных приложений с рендерингом 2D и 3D графики. Весь движок упакован в DLL, что позволяет отделить логику рендеринга от основной программы и значительно сократить код в EXE.


Архитектура DLL​


Все функции движка экспортируются через DLL и предоставляют простой интерфейс для работы с окном и DirectX:


  • DX_Init — инициализация движка и создание окна.
  • DX_BeginFrame — подготовка кадра для рендеринга (очистка буфера и установка рендер таргета).
  • DX_EndFrame — завершение кадра и вывод на экран.
  • DX_Shutdown — завершение работы движка и освобождение ресурсов.
  • DX_GetHWND — получение дескриптора окна (HWND).
  • DX_GetDevice / DX_GetContext — получение ID3D11Device и ID3D11DeviceContext для дополнительного рендеринга прямо из EXE.

Преимущества​


  • Быстрая интеграция в любой C++ проект.
  • Минимальное количество кода в EXE: достаточно вызвать несколько функций из DLL.
  • Возможность рисовать свои объекты и графику поверх базового рендеринга движка.
  • Полный контроль над DirectX 11 через предоставленные Device и Context.

Скачать DLL:
Пожалуйста, авторизуйтесь для просмотра ссылки.

VT:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Как добавить длл?
Заходим в папку где хранится наша exe
Кидаем длл в папку и используем в коде

Пример кода:
X:
Expand Collapse Copy
#include <windows.h>
#include <d3d11.h>
#include <cmath>
#pragma comment(lib,"d3d11.lib")

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
    HMODULE dll = LoadLibraryA("DXEngine.dll");
    if (!dll) { MessageBoxA(NULL, "Не удалось загрузить DLL", "Ошибка", MB_ICONERROR); return -1; }

    auto Init = (bool(*)(const wchar_t*, int, int))GetProcAddress(dll, "DX_Init");
    auto Begin = (void(*)(float, float, float))GetProcAddress(dll, "DX_BeginFrame");
    auto End = (void(*)())GetProcAddress(dll, "DX_EndFrame");
    auto Shut = (void(*)())GetProcAddress(dll, "DX_Shutdown");

    if (!Init(L"Переливающийся фон", 800, 600)) return -1;

    MSG msg = {};
    float t = 0.0f;
    while (msg.message != WM_QUIT) {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else {
            float r = (std::sin(t) + 1.0f) / 2.0f;
            float g = (std::sin(t + 2.0f) + 1.0f) / 2.0f;
            float b = (std::sin(t + 4.0f) + 1.0f) / 2.0f;
            Begin(r, g, b);
            End();
            t += 0.01f;
        }
    }

    Shut();
    FreeLibrary(dll);
    return 0;
}
 
Назад
Сверху Снизу