Я рендерирую в 2D -текстуру, используя вычислительный шейдер, а затем пытаюсь отобразить эту текстуру в окне imgui, используя imgui :: image () . Появляется окно графического интерфейса, и я добавил imgui :: text ("test") чуть ниже виджета изображения, чтобы подтвердить поведение макета. Вот соответствующий код: < /p>
void MyGui::createGui(GLuint textureID, int texWidth, int texHeight) {
dock();
// scene viewer
ImGui::Begin("Scene View");
ImVec2 windowSize = ImGui::GetContentRegionAvail();
ImGui::Image(
(ImTextureID)textureID,
windowSize
);
ImGui::Text("test");
ImGui::End();
}
< /code>
Вот мой основной цикл рендеринга: < /p>
void App::run() {
printDebugInfo();
while (!glfwWindowShouldClose(m_window)) {
// tell ImGui that a new frame is about to begin
m_my_gui.newFrameImGui();
// increment frame count
m_frame_count++;
// clear the buffer
glClearColor(0.1f, 0.1f, 0.2f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
// compute shader pass
m_compute_program.use();
setPerFrameUniforms(); // set !static uniforms every frame
if (m_frame_count == 1) // set static uniforms once
setStaticUniforms();
glBindImageTexture(0, m_compute_texture.getID(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
// If reading from same texture (for accumulation), bind as sampler
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_compute_texture.getID());
glUniform1i(glGetUniformLocation(m_compute_program.getID(), "inputTexture"), 1);
glDispatchCompute(m_WINDOW_WIDTH / 8, m_WINDOW_HEIGHT / 4, 1);
glMemoryBarrier(GL_ALL_BARRIER_BITS);
ImGui::Begin("Save");
if (ImGui::Button("Export")) {
exportImage(m_compute_texture.getID(), m_WINDOW_WIDTH, m_WINDOW_HEIGHT);
}
ImGui::End();
// draw all the GUI elements
m_my_gui.createGui(m_compute_texture.getID(), m_WINDOW_WIDTH, m_WINDOW_HEIGHT);
// redner ImGui, update events, swap buffers
m_my_gui.render();
glfwSwapBuffers(m_window);
glfwPollEvents();
}
}
< /code>
mygui class: < /p>
#include "MyGui.hpp"
MyGui::MyGui() {
}
MyGui::~MyGui() {
}
void MyGui::createGui(GLuint textureID, int texWidth, int texHeight) {
dock();
// scene viewer
ImGui::Begin("Scene View");
ImVec2 windowSize = ImGui::GetContentRegionAvail();
ImGui::Image(
(ImTextureID)textureID,
windowSize
);
ImGui::Text("test");
ImGui::End();
}
void MyGui::dock()
{
static bool opt_fullscreen = true;
static bool opt_padding = false;
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_None;
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
if (opt_fullscreen)
{
ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(viewport->Pos);
ImGui::SetNextWindowSize(viewport->Size);
ImGui::SetNextWindowViewport(viewport->ID);
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse |
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
}
if (!opt_padding)
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("DockSpace Demo", nullptr, window_flags);
if (!opt_padding)
ImGui::PopStyleVar();
// DockSpace
ImGuiID dockspace_id = ImGui::GetID("MyDockSpace");
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
ImGui::End();
}
void MyGui::initImGui(GLFWwindow* window) {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 460");
// flags
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
}
void MyGui::newFrameImGui() {
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
}
void MyGui::render() const {
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
// viewports
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
{
GLFWwindow* backup_current_context = glfwGetCurrentContext();
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
glfwMakeContextCurrent(backup_current_context);
}
}
< /code>
и класс текстур: < /p>
#include "Texture.hpp"
Texture::Texture(int width, int height)
: m_width(width), m_height(height), m_id(0) {
}
Texture::~Texture() {
glDeleteTextures(1, &m_id);
}
void Texture::create() {
glCreateTextures(GL_TEXTURE_2D, 1, &m_id);
glTextureParameteri(m_id, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTextureParameteri(m_id, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTextureParameteri(m_id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTextureParameteri(m_id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTextureStorage2D(m_id, 1, GL_RGBA32F, m_width, m_height);
}
void Texture::bind(GLenum texture_unit) const {
glBindTextureUnit(texture_unit, m_id);
}
Вот как это выглядит
Я попытался экспортировать текстуру, используя stb_iamge , чтобы увидеть, не будет ли она пустой, и это не было. Текстура существует в меммории. Попробовал переключиться с стыковки Imgui на Imgui Master, и это не помогло
Я рендерирую в 2D -текстуру, используя вычислительный шейдер, а затем пытаюсь отобразить эту текстуру в окне imgui, используя imgui :: image () . Появляется окно графического интерфейса, и я добавил imgui :: text ("test") чуть ниже виджета изображения, чтобы подтвердить поведение макета. Вот соответствующий код: < /p> [code]void MyGui::createGui(GLuint textureID, int texWidth, int texHeight) { dock();
ImGui::End(); } < /code> Вот мой основной цикл рендеринга: < /p> void App::run() { printDebugInfo();
while (!glfwWindowShouldClose(m_window)) { // tell ImGui that a new frame is about to begin m_my_gui.newFrameImGui(); // increment frame count m_frame_count++; // clear the buffer glClearColor(0.1f, 0.1f, 0.2f, 0.0f); glClear(GL_COLOR_BUFFER_BIT);
// compute shader pass m_compute_program.use();
setPerFrameUniforms(); // set !static uniforms every frame if (m_frame_count == 1) // set static uniforms once setStaticUniforms();
// If reading from same texture (for accumulation), bind as sampler glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_compute_texture.getID()); glUniform1i(glGetUniformLocation(m_compute_program.getID(), "inputTexture"), 1);
[/code] Вот как это выглядит Я попытался экспортировать текстуру, используя stb_iamge , чтобы увидеть, не будет ли она пустой, и это не было. Текстура существует в меммории. Попробовал переключиться с стыковки Imgui на Imgui Master, и это не помогло
Я пытаюсь применить текстуру OpenGL к функции ImGui::Image,
но ImGui::Image отображает неправильный буфер, и это заставляет меня думать, что текстура не привязывается и не отображается правильно.
Я устанавливаю функцию ImGui::Image так, чтобы она...
Мой друг предложил мне обойти его программу против импорта изображений. Он описывает основу того, как это работает, но я до сих пор не нашел для этого решения. Я кратко объясню, что я пробовал и как это работает (насколько я понимаю).
Я пытаюсь построить и запустить приложение OpenGL на основе QT на моем настольном компьютере Linux. Машина управляет атомным дистрибутом баззита, поэтому мне пришлось создать среду разработки в Distobox, которая является Ubuntu 24.04.2 LTS. 120 .
Я...
Итак, я прохожу курс Брэда Udemy о Laravel, и хотя он был написан почти два года назад, многие люди рекомендовали его мне, потому что все по-прежнему актуально. В одном из своих уроков он использует код композитора под названием Intervention,...
Когда я использовал образ Laravel Intervention на локальном хосте, он работал идеально, но при загрузке живого сервера в моей панели управления он не работает...