add RenderPass
This commit is contained in:
@ -148,8 +148,26 @@ TestLayer::TestLayer()
|
||||
|
||||
void TestLayer::OnAttach()
|
||||
{
|
||||
m_FrameBuffer.reset(Prism::FrameBuffer::Create(1280, 720, Prism::FramebufferFormat::RGBA16F));
|
||||
m_FinalPresentBuffer.reset(Prism::FrameBuffer::Create(1280, 720, Prism::FramebufferFormat::RGBA8));
|
||||
Prism::FramebufferSpecification geoFramebufferspec;
|
||||
geoFramebufferspec.Width = 1280;
|
||||
geoFramebufferspec.Height = 720;
|
||||
geoFramebufferspec.Format = Prism::FramebufferFormat::RGBA16F;
|
||||
geoFramebufferspec.ClearColor = {0.1f, 0.1f, 0.1f, 1.0f};
|
||||
|
||||
Prism::RenderPassSpecification geoRenderPass;
|
||||
geoRenderPass.TargetFramebuffer = Prism::FrameBuffer::Create(geoFramebufferspec);
|
||||
m_GeoPass = Prism::RenderPass::Create(geoRenderPass);
|
||||
|
||||
Prism::FramebufferSpecification finalFramebufferspec;
|
||||
finalFramebufferspec.Width = 1280;
|
||||
finalFramebufferspec.Height = 720;
|
||||
finalFramebufferspec.Format = Prism::FramebufferFormat::RGBA8;
|
||||
finalFramebufferspec.ClearColor = {0.1f, 0.1f, 0.1f, 1.0f};
|
||||
|
||||
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,
|
||||
@ -174,13 +192,18 @@ void TestLayer::OnAttach()
|
||||
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_Shader = Prism::Shader::Create("assets/shaders/demo.glsl");
|
||||
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/meshes/cerberus.fbx");
|
||||
// m_MeshMaterial = Prism::CreateRef<Prism::MaterialInstance>(m_Mesh->GetMaterial());
|
||||
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()
|
||||
@ -193,26 +216,47 @@ void TestLayer::OnUpdate(Prism::TimeStep deltaTime)
|
||||
m_Camera.Update(deltaTime);
|
||||
auto viewProjection = m_Camera.GetProjectionMatrix() * m_Camera.GetViewMatrix();
|
||||
|
||||
m_FrameBuffer->Bind();
|
||||
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_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_FrameBuffer->Unbind();
|
||||
|
||||
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);
|
||||
|
||||
Prism::Renderer::EndRenderPass();
|
||||
|
||||
|
||||
// HDR
|
||||
m_FinalPresentBuffer->Bind();
|
||||
Prism::Renderer::BeginRenderPass(m_FinalPass);
|
||||
m_HDRShader->Bind();
|
||||
m_HDRShader->SetFloat("u_Exposure", m_Exposure);
|
||||
m_FrameBuffer->BindTexture();
|
||||
m_GeoPass->GetSpecification().TargetFramebuffer->BindTexture();
|
||||
m_VertexArray->Bind();
|
||||
Prism::Renderer::DrawIndexed(m_VertexArray->GetIndexBuffer()->GetCount(), false);
|
||||
m_FinalPresentBuffer->Unbind();
|
||||
Prism::Renderer::EndRenderPass();
|
||||
}
|
||||
|
||||
void TestLayer::OnImGuiRender()
|
||||
@ -225,16 +269,18 @@ void TestLayer::OnImGuiRender()
|
||||
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_FrameBuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
m_FinalPresentBuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y);
|
||||
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_FinalPresentBuffer->GetColorAttachmentRendererID(), viewportSize, {0, 1}, {1, 0});
|
||||
ImGui::Image((ImTextureRef)m_FinalPass->GetSpecification().TargetFramebuffer->GetColorAttachmentRendererID(), viewportSize, {0, 1}, {1, 0});
|
||||
ImGui::End();
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#include "Prism/Renderer/Camera.h"
|
||||
#include "Prism/Renderer/FrameBuffer.h"
|
||||
#include "Prism/Renderer/Mesh.h"
|
||||
#include "Prism/Renderer/RenderPass.h"
|
||||
#include "Prism/Renderer/Shader.h"
|
||||
#include "Prism/Renderer/Texture.h"
|
||||
|
||||
@ -28,20 +29,62 @@ 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::FrameBuffer> m_FrameBuffer, m_FinalPresentBuffer;
|
||||
Prism::Ref<Prism::RenderPass> m_GeoPass, m_FinalPass;
|
||||
|
||||
|
||||
Prism::Ref<Prism::TextureCube> m_SkyBoxTextureCube;
|
||||
Prism::Ref<Prism::VertexArray> m_VertexArray;
|
||||
Prism::Ref<Prism::Shader> m_SkyboxShader;
|
||||
Prism::Ref<Prism::Shader> m_Shader;
|
||||
Prism::Ref<Prism::Shader> m_HDRShader;
|
||||
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;
|
||||
|
||||
float m_Exposure = 1.0f;
|
||||
|
||||
struct AlbedoInput
|
||||
{
|
||||
glm::vec3 Color = { 0.972f, 0.96f, 0.915f };
|
||||
Prism::Ref<Prism::Texture2D> TextureMap;
|
||||
bool SRGB = true;
|
||||
bool UseTexture = false;
|
||||
};
|
||||
AlbedoInput m_AlbedoInput;
|
||||
|
||||
struct NormalInput
|
||||
{
|
||||
Prism::Ref<Prism::Texture2D> TextureMap;
|
||||
bool UseTexture = false;
|
||||
};
|
||||
NormalInput m_NormalInput;
|
||||
|
||||
struct MetalnessInput
|
||||
{
|
||||
float Value = 1.0f;
|
||||
Prism::Ref<Prism::Texture2D> TextureMap;
|
||||
bool UseTexture = false;
|
||||
};
|
||||
MetalnessInput m_MetalnessInput;
|
||||
|
||||
struct RoughnessInput
|
||||
{
|
||||
float Value = 0.5f;
|
||||
Prism::Ref<Prism::Texture2D> TextureMap;
|
||||
bool UseTexture = false;
|
||||
};
|
||||
RoughnessInput m_RoughnessInput;
|
||||
|
||||
struct Light
|
||||
{
|
||||
glm::vec3 Direction;
|
||||
glm::vec3 Radiance;
|
||||
};
|
||||
Light m_Light;
|
||||
|
||||
float m_LightMultiplier = 0.3f;
|
||||
float m_MeshScale = 1.0f;
|
||||
bool m_RadiancePrefilter = false;
|
||||
float m_EnvMapRotation = 0.0f;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user