• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Imgui works only windowed mode

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2020
Сообщения
69
Реакции
3
в оконном режиме работает все отлично, как только переключаюсь на фулл скрин то крашит или не дает развернуть кс

present hook:
Expand Collapse Copy
HRESULT __fastcall
c_hooks::present_hook(IDXGISwapChain* swap_chain, UINT sync_interval, UINT flags)
{
    if (!hooks->render_target_view) {
        ID3D11Texture2D* back_buffer;
        DXGI_SWAP_CHAIN_DESC desc;
        swap_chain->GetDesc(&desc);
 
        hooks->window = desc.OutputWindow;
 
        swap_chain->GetDevice(__uuidof(ID3D11Device), reinterpret_cast<void**>(&hooks->device));
        hooks->device->GetImmediateContext(&hooks->context);
        swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&back_buffer));
 
        hooks->device->CreateRenderTargetView(back_buffer, nullptr, &hooks->render_target_view);
 
        if (back_buffer)
            back_buffer->Release();
 
 
        hooks->original_wndproc = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hooks->window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(wndproc_hook)));
 
        render->initialize(hooks->device, hooks->context, hooks->window);
    }
 
    ImGui_ImplDX11_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::NewFrame();
 
    ImGui::StyleColorsDark();
 
    menu->paint();
 
    ImGui::EndFrame();
 
    ImGui::Render();
    hooks->context->OMSetRenderTargets(1, &hooks->render_target_view, NULL);
    ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
 
    return hooks->original_present(swap_chain, sync_interval, flags);
}

resize buffers hook:
Expand Collapse Copy
HRESULT __fastcall
c_hooks::resize_buffers_hook(IDXGISwapChain* swap_chain, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swap_chain_flags)
{
    if (hooks->render_target_view) {
        hooks->render_target_view->Release();
        hooks->render_target_view = nullptr;
   }
 

 
    return hooks->original_resize_buffers(swap_chain, buffer_count, width, height, new_format, swap_chain_flags);
}
 
fixed. теперь появилась новая проблема, как я понял ресайз буффер у меня не правильно работает и теперь крашит при смене разрешения
вопросик еще такой,у вас тоже в дебаг моде багуется имгуишка?
 
Последнее редактирование:
для чего тебе StyleColorsDark в цикле обновлять
 
хуй знает почему у тебя там крашит

разрешение в фулл хд меняется и все окей, если менять на оконный то черный экран

hooks->context->OMSetRenderTargets(0, &hooks->render_target_view, nullptr); я увидел что не то написал, исправил
 
Последнее редактирование:

разрешение в фулл хд меняется и все окей, если менять на оконный то черный экран

hooks->context->OMSetRenderTargets(0, &hooks->render_target_view, nullptr); я увидел что не то написал, исправил
 
в resize buffers пересоздавай render target view и backbuffer


почему 0 лол?
в ресайзе не надо ?

Код:
Expand Collapse Copy
HRESULT __stdcall
c_hooks::resize_buffers_hook(IDXGISwapChain* swap_chain, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swap_chain_flags)
{
    if (hooks->render_target_view) {
        hooks->context->OMSetRenderTargets(0, NULL, NULL);
        hooks->render_target_view->Release();
        hooks->render_target_view = nullptr;
    }

    ImGui_ImplDX11_InvalidateDeviceObjects();

    const HRESULT reset = hooks->original_resize_buffers(swap_chain, buffer_count, width, height, new_format, swap_chain_flags);

    if (SUCCEEDED(reset)) {
        ID3D11Texture2D* back_buffer = nullptr;
        if (SUCCEEDED(swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&back_buffer)))
        {
            DXGI_SWAP_CHAIN_DESC sd;
            swap_chain->GetDesc(&sd);

            D3D11_RENDER_TARGET_VIEW_DESC desc{};
            desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
            desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;

            hooks->device->CreateRenderTargetView(back_buffer, &desc, &hooks->render_target_view);

            back_buffer->Release();;

        }
        ImGui_ImplDX11_CreateDeviceObjects();
    }

    return reset;
}
 
я так подумал, а может это из-за старой версии имгуишки такое происходит
 
я так подумал, а может это из-за старой версии имгуишки такое происходит
пробуй не думать а действовать не нравится ресайз бафер скопируй с других читов думаешь что то не там с имгуи обнови его
 
fixed. может кому-то понадобиться

resize_buffers_hook:
Expand Collapse Copy
HRESULT __stdcall
c_hooks::resize_buffers_hook(IDXGISwapChain* swap_chain, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swap_chain_flags)
{


    const HRESULT reset = hooks->original_resize_buffers(swap_chain, buffer_count, width, height, new_format, swap_chain_flags);

    if (SUCCEEDED(reset)) {
        ID3D11Texture2D* back_buffer = nullptr;
        if (SUCCEEDED(swap_chain->GetBuffer(0, IID_PPV_ARGS(&back_buffer))))
        {
            if (back_buffer)
            {
                D3D11_RENDER_TARGET_VIEW_DESC desc{};
                desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
                desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;

                hooks->device->CreateRenderTargetView(back_buffer, &desc, &hooks->render_target_view);

                back_buffer->Release();
            }
        }
    }

    return reset;
}


create_swap_chain_hook:
Expand Collapse Copy
HRESULT __stdcall
c_hooks::create_swap_chain_hook(IDXGIFactory* factory, IUnknown* device, DXGI_SWAP_CHAIN_DESC* desc,IDXGISwapChain** swap_chain)
{
    if (hooks->render_target_view) {
        hooks->render_target_view->Release();
        hooks->render_target_view = nullptr;
    }

    return hooks->original_create_swap_chain(factory, device, desc, swap_chain);
}


hooks.cpp:
Expand Collapse Copy
    IDXGIDevice* pDXGIDevice = NULL;
    hooks->device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice));

    IDXGIAdapter* pDXGIAdapter = NULL;
    pDXGIDevice->GetAdapter(&pDXGIAdapter);

    IDXGIFactory* pIDXGIFactory = NULL;
    pDXGIAdapter->GetParent(IID_PPV_ARGS(&pIDXGIFactory));

    void** dxgi = *(void***)pIDXGIFactory;

    create_hook("create_swap_chain", dxgi[10], create_swap_chain_hook, &original_create_swap_chain);

    if (pDXGIDevice) {
        pDXGIDevice->Release();
        pDXGIDevice = nullptr;
    }

    if (pDXGIAdapter) {
        pDXGIAdapter->Release();
        pDXGIAdapter = nullptr;
    }

    if (pIDXGIFactory) {
        pIDXGIFactory->Release();
        pIDXGIFactory = nullptr;
    }
 
Последнее редактирование:
Назад
Сверху Снизу