小白的光线追踪之旅 | 电视花屏渲染

168 阅读1分钟

在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结果 最终的渲染结果如下:

image.png

image.png