在c++语言的学习中,重要的是学习基础四大件和确定学习具体方向。 作为一个三年级fw,和计算机毫无关系的小白一枚,也想努力一下。 这是我学习光线追踪的随缘笔记。 通过cherno的学习笔记。使用了walnut的框架。 项目使用了GLFW和Valcan的图形库。 主要的实现代码如下:
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();
}
以上是一个render触发函数,通过以上代码会产生粉色的简单的渲染
经过如下设置,就可产生花瓶的动态渲染render特效:
virtual void OnUIRender() override
{
ImGui::Begin("Setting");
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;
//ImGui::ShowDemoWindow();
if(m_Image)
ImGui::Image(m_Image->GetDescriptorSet(), { (float)m_Image->GetWidth(), (float)m_Image->GetHeight() });
ImGui::End();
ImGui::PopStyleVar();
Render();
}
如果没有|=选项,就会是黑色的渲染render结果 最终的渲染结果如下: