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

Вопрос "Тень" при отрисовке окна и поп-апов ImGui.

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
16 Дек 2021
Сообщения
16
Реакции
1
Всем привет!

Столкнулся с проблемой при отрисовке поп-апов и окон в целом на имгуи 1.92.5(актуальный) dx11.
Пример кода:
C++:
Expand Collapse Copy
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0));

ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoSavedSettings;

ImGui::SetNextWindowSize(ImVec2(600, 300));
if (ImGui::Begin("test", nullptr, flags))
{
    ImGui::Text("окно");
    auto& ui = UI_builder::begin(0, globals::menu::scale);
    const char* testArray[] = { "жопа","какашки" };
    int test = 0;
    ui.combo(" ##combo", &test, testArray, IM_ARRAYSIZE(testArray));
}
ImGui::End();

ImGui::PopStyleColor();
ImGui::PopStyleVar(2);

Результат:
1771317140732.png
1771317163145.png

На скринах четко видно что-то вроде тени/обводки/ореола, хз как назвать.
Появляется это исключительно на окнах и поп-апах, все виджеты и примитивы в полном порядке.
Может кто-то знает фикс?

Спасибо.
 
Последнее редактирование:
Всем привет!

Столкнулся с проблемой при отрисовке поп-апов и окон в целом на имгуи 1.92.5(актуальный) dx11.
Пример кода:
C++:
Expand Collapse Copy
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0));

ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoSavedSettings;

ImGui::SetNextWindowSize(ImVec2(600, 300));
if (ImGui::Begin("test", nullptr, flags))
{
    ImGui::Text("окно");
    auto& ui = UI_builder::begin(0, globals::menu::scale);
    const char* testArray[] = { "жопа","какашки" };
    int test = 0;
    ui.combo(" ##combo", &test, testArray, IM_ARRAYSIZE(testArray));
}
ImGui::End();

ImGui::PopStyleColor();
ImGui::PopStyleVar(2);

Результат:

На скринах четко видно что-то вроде тени/обводки/ореола, хз как назвать.
Появляется это исключительно на окнах и поп-апах, все виджеты и примитивы в полном порядке.
Может кто-то знает фикс?

Спасибо.
Не нашел в твоём коде вообще не 1 намека на тени
 
Не нашел в твоём коде вообще не 1 намека на тени
потому что его и нет)
я просто прикрепил этот код что бы было видно, что вызов корректный и никаких теней тут нет.
надеялся что кто-то укажет на какие-нибудь флаги или неочевидные вещи в инициализации, но как оказалось там у меня тоже всё четко
только что решил проблему, ниже распишу в чем дело было

дело в том, что я пишу экстернал и соответственно рисую в отдельном оверлее (наверное стоило сказать об этом сразу).
как оказалось в таких случаях нужно патчить imgui_impl_dx11.cpp, так как винда ожидает предварительно умноженную альфу, а не оригинальную отдаваемую имгуи.

что конкретно поменял для правильной отрисовки:
ImGui_ImplDX11_CreateDeviceObjects(), внутри pixelShader (514 строка):
Expand Collapse Copy
было
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \

стало
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
out_col.rgb *= out_col.a; \
return out_col; \

ImGui_ImplDX11_CreateDeviceObjects(), 535 строка:
Expand Collapse Copy
было
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;

стало
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;

1771331976541.png

вдруг кому-то это поможет...
 
Последнее редактирование:
потому что его и нет)
я просто прикрепил этот код что бы было видно, что вызов корректный и никаких теней тут нет.
надеялся что кто-то укажет на какие-нибудь флаги или неочевидные вещи в инициализации, но как оказалось там у меня тоже всё четко
только что решил проблему, ниже распишу в чем дело было

дело в том, что я пишу экстернал и соответственно рисую в отдельном оверлее (наверное стоило сказать об этом сразу).
как оказалось в таких случаях нужно патчить imgui_impl_dx11.cpp, так как винда ожидает предварительно умноженную альфу, а не оригинальную отдаваемую имгуи.

что конкретно поменял для правильной отрисовки:
ImGui_ImplDX11_CreateDeviceObjects(), внутри pixelShader (514 строка):
Expand Collapse Copy
было
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \

стало
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
out_col.rgb *= out_col.a; \
return out_col; \

ImGui_ImplDX11_CreateDeviceObjects(), 535 строка:
Expand Collapse Copy
было
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;

стало
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;


вдруг кому-то это поможет...
👍
 
Назад
Сверху Снизу