Рендеринг текстуры OpenGL в ImGui::Image с использованием двух цветовых буферов [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Рендеринг текстуры OpenGL в ImGui::Image с использованием двух цветовых буферов [закрыто]

Сообщение Anonymous »

Я пытаюсь применить текстуру OpenGL к функции ImGui::Image,
но ImGui::Image отображает неправильный буфер, и это заставляет меня думать, что текстура не привязывается и не отображается правильно.
Я устанавливаю функцию ImGui::Image так, чтобы она закрывала правые 3/4 экрана, и color_buffer[0 ] — это «обычный» буфер, привязанный к кадровому буферу HDR, а color_buffer[1] содержит цвета HDR выше 1.0, также привязанные к кадровому буферу HDR (здесь 2 разных цветовых вложения).
// Flip UV coordinates for the image
ImVec2 uv0 = ImVec2(0.0f, 1.0f);
ImVec2 uv1 = ImVec2(1.0f, 0.0f);
// This appears to render incorrectly
ImGui::Image(reinterpret_cast(static_cast(bloom_tools.color_buffers[0])),
voxel_scene_size, uv0, uv1);

Изображение
Как показано, графический интерфейс визуализируется правильно, но сцена не имеет постобработки.
Я использовал RenderDoc, чтобы убедиться, что цвет обратного буфера содержит правильно постобработанное изображение.
Я создал этот захват RenderDoc путем замены окна подкачки SDL и вызова функции рендеринга ImGui следующим образом:
// Call swap buffers first
SDL_GL_SwapWindow(sdl_window);
// Now do ImGui render
ImGui::Render();
glViewport(0, 0, display_w, display_h);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

Цвет обратного буфера отображается через графический интерфейс на снимке экрана RenderDoc.
Изображение
В результате получается объединенная сцена (постобработка и графический интерфейс):
[img]https://i .sstatic.net/gNJqvBIz.png[/img]

Обзор кода, использующего SDL и OpenGL, выглядит следующим образом:
// This is the main game loop - it handles input, update, and rendering
while (running) {
// FRAME RATE
uint64_t now = SDL_GetTicks();
double elapsed = static_cast(now - previous) / 1000.0;
elapsed = SDL_min(elapsed, 0.2);
elapsed = SDL_max(elapsed, 0.0);
previous = now;

// Some GUI state variables
static bool show_demo_window = false;

// Handle SDL events and motion updates
static constexpr auto FIXED_TIME_STEP = 1.0 / 60.0;
time_accum += elapsed;
while (time_accum >= FIXED_TIME_STEP) {
running = handle_events_and_motion(FIXED_TIME_STEP);
time_accum -= FIXED_TIME_STEP;
time_step += FIXED_TIME_STEP;
}
// Use ImGui for GUI size calculations
int display_w, display_h;
SDL_GetWindowSize(sdl_window, &display_w, &display_h);
ImVec2 display_size = { static_cast(display_w), static_cast(display_h) };

// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL3_NewFrame();
ImGui::NewFrame();

// Show the big demo window?
if (show_demo_window) {
ImGui::ShowDemoWindow(&show_demo_window);
}

float tab_window_width = display_size.x * 0.25f;
// Tabs
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2(display_size.x * 0.25f, display_size.y));
ImGui::Begin("Tab Bar", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
// Handle any other GUI components
ImGui::End();

// Next The 3D scene rendered to an OpenGL texture and displayed as a GUI Image
ImGui::SetNextWindowPos(ImVec2(tab_window_width, 0));
ImGui::SetNextWindowSize(ImVec2(display_size.x * 0.75f, display_size.y));
ImGui::Begin("Voxels",
nullptr,
ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoCollapse |
ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoBringToFrontOnFocus
);

// Render 3D scene to an HDR FBO - this works regardless of which buffer is rendered

// Now apply bloom affect
// Complete the pingpong buffer for the bloom effect
glUseProgram(blur_attrib.program);
for (auto i = 0; i < bloom_tools.NUM_FBO_ITERATIONS; i++) {
glBindFramebuffer(GL_FRAMEBUFFER, bloom_tools.fbo_pingpong[bloom_tools.horizontal_blur]);
glUniform1i(blur_attrib.extra1, bloom_tools.horizontal_blur);
if (bloom_tools.first_iteration) {
// Write to the floating-point buffer / COLOR_ATTACHMENT1 first iteration
glUniform1i(blur_attrib.sampler, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, bloom_tools.color_buffers[1]);
bloom_tools.first_iteration = false;
} else {
glBindTexture(GL_TEXTURE_2D, bloom_tools.color_buffers_pingpong[!bloom_tools.horizontal_blur]);
}
bloom_tools.horizontal_blur = !bloom_tools.horizontal_blur;
glBindVertexArray(quad_vao);
glDisable(GL_DEPTH_TEST);
glDrawArrays(GL_TRIANGLES, 0, 6);
}
bloom_tools.first_iteration = true;

glBindFramebuffer(GL_FRAMEBUFFER, 0);

// Post-processing the default frame buffer
// Render HDR buffer to 2D quad and apply bloom filter
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(screen_attrib.program);
glUniform1i(screen_attrib.sampler, 0);
glUniform1i(screen_attrib.extra3, 1);
glBindVertexArray(quad_vao);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, bloom_tools.color_buffers[0]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, bloom_tools.color_buffers_pingpong[!bloom_tools.horizontal_blur]);
glUniform1i(screen_attrib.extra1, gui->apply_bloom_effect);
glUniform1f(screen_attrib.extra2, gui->exposure);
glDisable(GL_DEPTH_TEST);
glDrawArrays(GL_TRIANGLES, 0, 6);

// Flip UV coordinates for the image
ImVec2 voxel_scene_size = ImGui::GetContentRegionAvail();
ImVec2 uv0 = ImVec2(0.0f, 1.0f);
ImVec2 uv1 = ImVec2(1.0f, 0.0f);
ImGui::Image(reinterpret_cast(static_cast(bloom_tools.color_buffers[0])), voxel_scene_size, uv0, uv1);

glUseProgram(0);
glBindVertexArray(0);

ImGui::End();

// Render the GUI
ImGui::Render();
glViewport(0, 0, display_w, display_h);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

// Render this and the bloom/post-processed texture is NOT shown until after the swap buffer
SDL_GL_SwapWindow(sdl_window);

CHECK_GL_ERR();

} // GAME LOOP
```


Подробнее здесь: https://stackoverflow.com/questions/791 ... or-buffers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Текстура OpenGL показывает сплошной цвет текстуры, а не всей текстуры.
    Anonymous » » в форуме C++
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Функция imgui Image () не работает, OpenGL [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • ImGui Hooking (imgui-antihook) [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Почему мое видео не соответствует размеру текстуры, когда я меняю размер текстуры
    Anonymous » » в форуме Android
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Захват кадра с использованием OpenCV в медленном потоке и рендеринг со скоростью экрана в быстром дорогом потоке imgui.
    Anonymous » » в форуме C++
    0 Ответы
    69 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»