我正在制作一个伪光线追踪器(光线实际上并不在场景周围反弹),并决定使用 ImGui 来允许用户更改对象的材质属性。然而,除了我已经拥有的图形内容之外,窗口上没有显示任何其他内容。
我使用的是SDL2、OpenGL3,GLSL是
#version 430
。
我用这段代码初始化 ImGui。
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
const char* glslVersion = "#version 430";
ImGui_ImplSDL2_InitForOpenGL(_myFramework.GetWindow(), _myFramework.GetGLContext());
ImGui_ImplOpenGL3_Init(glslVersion);
_myFramework 保存窗口并处理绘图、交换窗口等。
然后在主循环中我有这段代码。
_myFramework.UpdateWindow(winSize.x, winSize.y);
_myFramework.ClearWindow();
RayTraceParallel(16, winSize, &camera, &rayTracer, &_myFramework);
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Material Controls");
ImGui::Text("Hello World!");
ImGui::End();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
_myFramework.Show();
RayTraceParallel() 将使用我们并行请求的任意多个线程对场景进行光线跟踪,但它会在该函数中等待,直到所有线程完成,直到我们按顺序继续执行其余代码。
还值得注意的是,我一次将一个像素绘制到纹理上,该纹理在 _myFramework.Show() 中绑定并绘制到整个屏幕。
编辑: 如果我删除光线追踪代码,那么我只会得到一个空白屏幕,仍然没有 GUI。
发现问题了!
这是因为我是因为将纹理绘制到屏幕上会绘制在 GUI 的顶部。我必须将这些函数分成“DrawScreenTexture()”函数,然后只是一个“SwapWindow()”函数。代码现在看起来像这样。
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Material Controls");
ImGui::Text("Hello World!");
ImGui::End();
_myFramework.DrawScreenTexture();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
_myFramework.SwapWindow();
还要向那些对我的问题投反对票的人和编辑我的问题以消除任何个性的人大喊大叫。