Imgui调整
本项目已开源,地址为:https://github.com/THEKUNzz/ray_tracing
根据课程学习得来,作者为The Cherno,视频地址为:
https://www.youtube.com/watch?v=gfW1Fhd9u9Q&list=PLlrATfBNZ98edc5GshdBtREv5asFW3yXl
git clone 代码修改
github下载的Imgui存在问题,现在已修正
// imgui.cpp中进行修改
// 源代码报错位置为3884行 未定义的DC,以及空指针异常报错。
// 源代码为:
for (int i = 0; i < Layouts.Data.Size; i++)
{
ImGuiLayout* layout = (ImGuiLayout*)DC.Layouts.Data[i].val_p;
IM_DELETE(layout);
}
// 应该修改为:
if (window != nullptr) {
for (int i = 0; i < window->DC.Layouts.Data.Size; i++)
{
ImGuiLayout* layout = (ImGuiLayout*)window->DC.Layouts.Data[i].val_p;
IM_DELETE(layout);
}
}
RayTracing.cpp编写
这里是作者开源框架 walnut 和 imgui 结合的内容,请根据视频自行学习。
实现功能为:
- 拉伸区域可填充。
- 实现了每帧数的随机渲染。
#include "Walnut/Application.h"
#include "Walnut/EntryPoint.h"
#include "Walnut/Image.h"
#include "Walnut/Random.h"
#include "Walnut/Timer.h"
using namespace Walnut;
class ExampleLayer : public Walnut::Layer
{
public:
virtual void OnUIRender() override
{
ImGui::Begin("Settings");
ImGui::Text("Last render: %.3fms", m_LastRenderTime);
if (ImGui::Button("Render")) {
Render();
};
ImGui::End();
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("Viewport");
m_ViewportWidth = ImGui::GetContentRegionAvail().x;
m_ViewportHeight = ImGui::GetContentRegionAvail().y;
if(m_Image)
ImGui::Image(m_Image->GetDescriptorSet(), { (float)m_Image->GetWidth(), (float)m_Image->GetHeight() });
ImGui::End();
ImGui::PopStyleVar();
Render();
}
void Render()
{
Timer timer;
if (!m_Image || m_ViewportWidth != m_Image->GetWidth() || m_ViewportHeight != m_Image->GetHeight())
{
m_Image = std::make_shared<Image>(m_ViewportWidth, m_ViewportHeight, ImageFormat::RGBA);
delete[] m_ImageData;
m_ImageData = new uint32_t[m_ViewportWidth * m_ViewportHeight];
}
for (uint32_t i = 0; i < m_ViewportWidth * m_ViewportHeight; i++)
{
m_ImageData[i] = Random::UInt();
m_ImageData[i] |= 0xff000000;
}
m_Image->SetData(m_ImageData);
m_LastRenderTime = timer.ElapsedMillis();
}
private:
std::shared_ptr<Image> m_Image;
uint32_t* m_ImageData = nullptr;
uint32_t m_ViewportWidth = 0, m_ViewportHeight = 0;
float m_LastRenderTime = 0.0f;
};
Walnut::Application* Walnut::CreateApplication(int argc, char** argv)
{
Walnut::ApplicationSpecification spec;
spec.Name = "Ray Tracing";
Walnut::Application* app = new Walnut::Application(spec);
app->PushLayer<ExampleLayer>();
app->SetMenubarCallback([app]()
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Exit"))
{
app->Close();
}
ImGui::EndMenu();
}
});
return app;
}
结果ui展示
结束语
如果你对我的内容感兴趣,或者在学习过程中存在困难,可以在我 github 上留言,或私信我。