некоторое время go Я следовал некоторому руководству по SDL, чтобы проколотить некоторые изображения, и у меня есть тестовая функция, которая проходит по вектору текстур SDL, и назначение реагирует, а затем вызывает следующую функцию, чтобы скопировать изображение в окно.
void SpriteSheets::draw(const Sprite* sprite, SDL_Rect* dest) {
SDL_RenderCopy(renderer, sprite->texture, sprite->rect, dest);
SDL_RenderPresent(renderer);
}
// this is probably not relevant but including the clear/calling the draw function
void SpriteSheets::clearScreen() {
SDL_SetRenderDrawColor(renderer, 150, 0, 100, 0); // debug color
SDL_RenderClear(renderer);
}
void GameContext::drawSprites() {
const auto& sprites = std::get<comp::sprite>(c.components);
const auto& position = std::get<comp::position>(c.components);
SpriteSheets::clearScreen();
for ( size_t i = 0; i < sprites.size(); i++ ) {
SDL_Rect dest;
dest.h = 50;
dest.w = 50;
dest.x = position[i].x();
dest.y = position[i].y();
SpriteSheets::draw(&sprites[i], &dest);
}
}
Все это «работает» в том смысле, что все «спрайты» отображаются отлично
Затем я установил im gui, что было хорошо (я переписал большую часть примера sdl / vulkan для используйте привязки vulkan c ++ вместо c api) 90% кода / структуры взяты из примера im gui https://github.com/ocornut/imgui/blob/master/examples/example_sdl_vulkan/main.cpp, причем каждая часть организована в отдельные функции.
// relevant gui clear...
// at some point clear color is set to this
this->clear_color = ImVec4(0.0f, 1.0f, 0.5f, 0.00f); //gross color for debugging
// snip
void Gui::clear(bool should_clear) {
ImGui::Render();
if ( should_clear ) memcpy(&wd.ClearValue.color.float32[0], &clear_color, 4 * sizeof(float));
}
// snip
void GraphicContext::mainLoop(GameContext* game) {
//Frame Setup
gui.frameSetup(); //rebuild swapchain if needed and then call imgui begin frame
// draw the "game"
// which is just a few static png's at different locations
game->drawSprites(); //when surounded by imgui functions it is hidden and not displayed
//draw the imgui menu overtop
if ( gui.show_demo_window ) ImGui::ShowDemoWindow(&gui.show_demo_window);
//End frame
gui.clear(false); // has ImGui::Render(); and conditional copy clear color
gui.frameRender(); // put all the imgui commands into a command buffer
gui.framePresent(); // submit Queue
}
Опять же, установка im gui «работает», и я успешно показываю демонстрационное окно. кроме того, я могу легко создать свой собственный windows и не иметь проблем с API.
Моя проблема в том, что я могу заставить эти две концепции работать отдельно. Если я удаляю очистить экран / скопировать очистить значение в clear_color, то цвет фона gui.clear(false);
вместо gui.clear(true)
для im gui, чистый цвет будет черным / он по-прежнему покрывает спрайты sdl. (То же самое с установкой значения clear для альфа-значения 0.) Я попытался упорядочить вызов drawSprites до и после фрейма im gui, но он всегда перезаписывает / закрывает его.
I Поймите, я не включаю минимальный воспроизводимый пример, и я не включаю все функции im gui, но его много шаблонного (vulkan делает функции setup / render / present 100+ строк и включает в себя настройку для контекстов нажимает что еще 600+ строк.)
Кто-нибудь знает, как запретить im gui очистку экрана (я уже очищаю экран в разделе sdl) (возможно, измените проход рендеринга?)
//relevant part of frameRender()
{
VkRenderPassBeginInfo info{
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
.pNext = NULL,
.renderPass = wd.RenderPass,
.framebuffer = fd->Framebuffer,
//.renderArea = {{0,0}, {wd.Width, wd.Height}},
.clearValueCount = 1,
.pClearValues = &wd.ClearValue
};
// the initializer for this doesn't work and idk why.
// when I set the second two zeros in the render area initalizer list to width and height
// it wants to be converted to uint32 but when I do that it crashes with a read acess violation.
info.renderArea.extent.width = wd.Width;
info.renderArea.extent.height = wd.Height;
vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE);
}
Я попытался установить значение очистить count / pClearValue в NULL, но это просто делает структуру информации больше не действительной / cra sh (должно быть хотя бы 1 запись), и я перепроверил, что альфа была 0 для чистого цвета на этом этапе.
В качестве альтернативы, я мог бы попытаться объединить все sdl dr aws в буфер команд im gui (или заменить draw я использую sdl с чистым vulkan)
Я часами отлаживал это, медленно переписывая весь пример кода, чтобы понять, как его настроить, но я нахожусь в том же положении, в котором я был в возрасте go с небольшим или отсутствующим прогрессом, перерисовывающим остальную часть окна.
Мне, вероятно, придется переделывать весь учебник Vulkan, потому что прошел год с тех пор, как я его коснулся, и мои проблемы, вероятно, очевидны, но я надеялся потому что я использовал im gui и sdl, я мог сначала написать немного движка и вернуться обратно в бэкэнд рендеринга, чтобы позже оптимизировать вещи, если это необходимо.