add MSAA, renderer2D, boundingbox
This commit is contained in:
@ -142,68 +142,24 @@ static void EnableDockSpace(const bool enable)
|
||||
|
||||
|
||||
TestLayer::TestLayer()
|
||||
:m_Camera(glm::perspectiveFov(glm::radians(45.0f), 1280.0f, 720.0f, 0.1f, 1000.0f))
|
||||
{
|
||||
}
|
||||
|
||||
void TestLayer::OnAttach()
|
||||
{
|
||||
Prism::FramebufferSpecification geoFramebufferspec;
|
||||
geoFramebufferspec.Width = 1280;
|
||||
geoFramebufferspec.Height = 720;
|
||||
geoFramebufferspec.Format = Prism::FramebufferFormat::RGBA16F;
|
||||
geoFramebufferspec.ClearColor = {0.1f, 0.1f, 0.1f, 1.0f};
|
||||
auto environment = Prism::Environment::Load("assets/env/birchwood_4k.hdr");
|
||||
{
|
||||
m_Scene = Prism::CreateRef<Prism::Scene>("test Scene");
|
||||
m_Scene->SetCamera(Prism::Camera(glm::perspectiveFov(glm::radians(45.0f), 1280.0f, 720.0f, 0.1f, 10000.0f)));
|
||||
m_Scene->SetEnvironment(environment);
|
||||
|
||||
Prism::RenderPassSpecification geoRenderPass;
|
||||
geoRenderPass.TargetFramebuffer = Prism::FrameBuffer::Create(geoFramebufferspec);
|
||||
m_GeoPass = Prism::RenderPass::Create(geoRenderPass);
|
||||
m_MeshEntity = m_Scene->CreateEntity("test Entity");
|
||||
|
||||
Prism::FramebufferSpecification finalFramebufferspec;
|
||||
finalFramebufferspec.Width = 1280;
|
||||
finalFramebufferspec.Height = 720;
|
||||
finalFramebufferspec.Format = Prism::FramebufferFormat::RGBA8;
|
||||
finalFramebufferspec.ClearColor = {0.1f, 0.1f, 0.1f, 1.0f};
|
||||
m_MeshEntity->SetMesh(Prism::CreateRef<Prism::Mesh>("assets/meshes/TestScene.fbx"));
|
||||
m_MeshMaterial = m_MeshEntity->GetMesh()->GetMaterial();
|
||||
|
||||
Prism::RenderPassSpecification finalRenderPass;
|
||||
finalRenderPass.TargetFramebuffer = Prism::FrameBuffer::Create(finalFramebufferspec);
|
||||
m_FinalPass = Prism::RenderPass::Create(finalRenderPass);
|
||||
}
|
||||
|
||||
|
||||
static float QuadVertex[] = {
|
||||
-1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
||||
1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
|
||||
1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
|
||||
-1.0f, 1.0f, 0.0f, 0.0f, 1.0f
|
||||
};
|
||||
|
||||
static uint32_t QuadIndices[] = {
|
||||
0, 1, 2, 2, 3, 0
|
||||
};
|
||||
|
||||
m_VertexArray = Prism::VertexArray::Create();
|
||||
auto quadVB = Prism::VertexBuffer::Create(QuadVertex, sizeof(QuadVertex) * sizeof(float));
|
||||
quadVB->SetLayout({
|
||||
{ Prism::ShaderDataType::Float3, "a_Position" },
|
||||
{ Prism::ShaderDataType::Float2, "a_TexCoord" }
|
||||
});
|
||||
m_VertexArray->AddVertexBuffer(quadVB);
|
||||
|
||||
auto ib = Prism::IndexBuffer::Create(QuadIndices, 6 * sizeof(uint32_t));
|
||||
m_VertexArray->SetIndexBuffer(ib);
|
||||
|
||||
m_SkyBoxTextureCube.reset(Prism::TextureCube::Create("assets/textures/environments/Arches_E_PineTree_Radiance.tga"));
|
||||
m_EnvironmentIrradiance.reset(Prism::TextureCube::Create("assets/textures/environments/Arches_E_PineTree_Irradiance.tga"));
|
||||
|
||||
m_SkyBoxShader = Prism::Shader::Create("assets/shaders/quad.glsl");
|
||||
m_HDRShader = Prism::Shader::Create("assets/shaders/hdr.glsl");
|
||||
|
||||
m_Mesh = std::make_unique<Prism::Mesh>("assets/models/m1911/m1911.fbx");
|
||||
m_MeshMaterial = Prism::CreateRef<Prism::MaterialInstance>(m_Mesh->GetMaterial());
|
||||
|
||||
m_BRDFLUT.reset(Prism::Texture2D::Create("assets/textures/BRDF_LUT.tga"));
|
||||
|
||||
m_Light.Direction = {-0.5f, -0.5f, 1.0f};
|
||||
m_Light.Radiance = {1.0f, 1.0f, 1.0f};
|
||||
}
|
||||
|
||||
void TestLayer::OnDetach()
|
||||
@ -213,78 +169,48 @@ void TestLayer::OnDetach()
|
||||
void TestLayer::OnUpdate(Prism::TimeStep deltaTime)
|
||||
{
|
||||
|
||||
m_Camera.Update(deltaTime);
|
||||
auto viewProjection = m_Camera.GetProjectionMatrix() * m_Camera.GetViewMatrix();
|
||||
|
||||
Prism::Renderer::BeginRenderPass(m_GeoPass);
|
||||
Prism::Renderer::Clear(m_clearColor[0], m_clearColor[1], m_clearColor[2], m_clearColor[3]);
|
||||
|
||||
// SkyBox
|
||||
m_SkyBoxShader->Bind();
|
||||
m_SkyBoxShader->SetMat4("u_InverseVP", inverse(viewProjection));
|
||||
m_SkyBoxTextureCube->Bind(0);
|
||||
m_VertexArray->Bind();
|
||||
Prism::Renderer::DrawIndexed(m_VertexArray->GetIndexBuffer()->GetCount(), false);
|
||||
|
||||
|
||||
m_MeshMaterial->Set("u_AlbedoColor", m_AlbedoInput.Color);
|
||||
m_MeshMaterial->Set("u_Metalness", m_MetalnessInput.Value);
|
||||
m_MeshMaterial->Set("u_Roughness", m_RoughnessInput.Value);
|
||||
m_MeshMaterial->Set("u_ViewProjectionMatrix", viewProjection);
|
||||
m_MeshMaterial->Set("u_ModelMatrix", glm::scale(glm::mat4(1.0f), glm::vec3(m_MeshScale)));
|
||||
m_MeshMaterial->Set("lights", m_Light);
|
||||
m_MeshMaterial->Set("u_CameraPosition", m_Camera.GetPosition());
|
||||
m_MeshMaterial->Set("u_RadiancePrefilter", m_RadiancePrefilter ? 1.0f : 0.0f);
|
||||
m_MeshMaterial->Set("u_AlbedoTexToggle", m_AlbedoInput.UseTexture ? 1.0f : 0.0f);
|
||||
m_MeshMaterial->Set("u_NormalTexToggle", m_NormalInput.UseTexture ? 1.0f : 0.0f);
|
||||
m_MeshMaterial->Set("u_MetalnessTexToggle", m_MetalnessInput.UseTexture ? 1.0f : 0.0f);
|
||||
m_MeshMaterial->Set("u_RoughnessTexToggle", m_RoughnessInput.UseTexture ? 1.0f : 0.0f);
|
||||
m_MeshMaterial->Set("u_EnvMapRotation", m_EnvMapRotation);
|
||||
m_MeshMaterial->Set("u_EnvRadianceTex", m_SkyBoxTextureCube);
|
||||
m_MeshMaterial->Set("u_EnvIrradianceTex", m_EnvironmentIrradiance);
|
||||
m_MeshMaterial->Set("u_BRDFLUTTexture", m_BRDFLUT);
|
||||
|
||||
m_Mesh->Render(deltaTime, glm::mat4(1.0f), m_MeshMaterial);
|
||||
if (m_AllowViewportCameraEvents)
|
||||
m_Scene->GetCamera().OnUpdate(deltaTime);
|
||||
|
||||
Prism::Renderer::EndRenderPass();
|
||||
|
||||
|
||||
// HDR
|
||||
Prism::Renderer::BeginRenderPass(m_FinalPass);
|
||||
m_HDRShader->Bind();
|
||||
m_HDRShader->SetFloat("u_Exposure", m_Exposure);
|
||||
m_GeoPass->GetSpecification().TargetFramebuffer->BindTexture();
|
||||
m_VertexArray->Bind();
|
||||
Prism::Renderer::DrawIndexed(m_VertexArray->GetIndexBuffer()->GetCount(), false);
|
||||
Prism::Renderer::EndRenderPass();
|
||||
m_Scene->OnUpdate(deltaTime);
|
||||
}
|
||||
|
||||
void TestLayer::OnImGuiRender()
|
||||
{
|
||||
EnableDockSpace(true);
|
||||
|
||||
ImGui::Begin("Settings");
|
||||
ImGui::ColorEdit4("ClearColor", glm::value_ptr(m_clearColor));
|
||||
ImGui::ColorEdit4("TriangleClearColor", glm::value_ptr(m_TriangleColor));
|
||||
ImGui::DragFloat("Exposure", &m_Exposure, 0.01f, 0.0f);
|
||||
const auto& position = m_Camera.GetPosition();
|
||||
ImGui::Text("Camera: (%.2f, %.2f, %.2f)", position.x, position.y, position.z);
|
||||
|
||||
|
||||
ImGui::End();
|
||||
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||
ImGui::Begin("Viewport");
|
||||
auto viewportSize = ImGui::GetContentRegionAvail();
|
||||
m_GeoPass->GetSpecification().TargetFramebuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
m_FinalPass->GetSpecification().TargetFramebuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
m_Camera.SetProjectionMatrix(glm::perspectiveFov(glm::radians(45.0f), viewportSize.x, viewportSize.y, 0.1f, 10000.0f));
|
||||
ImGui::Image((ImTextureRef)m_FinalPass->GetSpecification().TargetFramebuffer->GetColorAttachmentRendererID(), viewportSize, {0, 1}, {1, 0});
|
||||
Prism::SceneRenderer::SetViewportSize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
m_Scene->GetCamera().SetProjectionMatrix(glm::perspectiveFov(glm::radians(45.0f), viewportSize.x, viewportSize.y, 0.1f, 10000.0f));
|
||||
m_Scene->GetCamera().SetViewportSize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
ImGui::Image((ImTextureRef)Prism::SceneRenderer::GetFinalColorBufferRendererID(), viewportSize, { 0, 1 }, { 1, 0 });
|
||||
|
||||
|
||||
auto windowSize = ImGui::GetWindowSize();
|
||||
ImVec2 minBound = ImGui::GetWindowPos();
|
||||
ImVec2 maxBound = { minBound.x + windowSize.x, minBound.y + windowSize.y };
|
||||
m_AllowViewportCameraEvents = ImGui::IsMouseHoveringRect(minBound, maxBound);
|
||||
|
||||
ImGui::End();
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
|
||||
void TestLayer::OnEvent(Prism::Event& e)
|
||||
{
|
||||
if (m_AllowViewportCameraEvents)
|
||||
m_Scene->GetCamera().OnEvent(e);
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
#include "Prism/Renderer/RenderPass.h"
|
||||
#include "Prism/Renderer/Shader.h"
|
||||
#include "Prism/Renderer/Texture.h"
|
||||
#include "Prism/Scene/Scene.h"
|
||||
|
||||
|
||||
class TestLayer : public Prism::Layer
|
||||
@ -29,16 +30,11 @@ private:
|
||||
glm::vec4 m_clearColor = glm::vec4(0.1f, 0.1f, 0.1f, 1.0f);
|
||||
glm::vec4 m_TriangleColor = glm::vec4(1.0f);
|
||||
|
||||
Prism::Ref<Prism::RenderPass> m_GeoPass, m_FinalPass;
|
||||
Prism::Ref<Prism::Scene> m_Scene;
|
||||
Prism::Entity* m_MeshEntity;
|
||||
Prism::Ref<Prism::Material> m_MeshMaterial;
|
||||
|
||||
Prism::Ref<Prism::VertexArray> m_VertexArray;
|
||||
Prism::Ref<Prism::TextureCube> m_SkyBoxTextureCube, m_EnvironmentIrradiance;
|
||||
Prism::Ref<Prism::Shader> m_HDRShader, m_SkyBoxShader;
|
||||
Prism::Ref<Prism::Mesh> m_Mesh;
|
||||
Prism::Ref<Prism::MaterialInstance> m_MeshMaterial;
|
||||
Prism::Ref<Prism::Texture2D> m_BRDFLUT;
|
||||
|
||||
Prism::Camera m_Camera;
|
||||
bool m_AllowViewportCameraEvents = false;
|
||||
|
||||
float m_Exposure = 1.0f;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user