diff --git a/src/demo/sky_quad.cc b/src/demo/sky_quad.cc index ed18bb3..ad3901b 100644 --- a/src/demo/sky_quad.cc +++ b/src/demo/sky_quad.cc @@ -27,7 +27,7 @@ bool SkyQuad::Create() { if (!source->Load("sky.glsl")) return false; shader_->Create(std::move(source), engine.GetQuad()->vertex_description(), - Engine::Get().GetQuad()->primitive()); + Engine::Get().GetQuad()->primitive(), false); scale_ = engine.GetScreenSize(); diff --git a/src/engine/engine.cc b/src/engine/engine.cc index 3c3a730..a4d6e1f 100644 --- a/src/engine/engine.cc +++ b/src/engine/engine.cc @@ -479,7 +479,7 @@ bool Engine::CreateRenderResources() { return false; } pass_through_shader_->Create(std::move(source), quad_->vertex_description(), - quad_->primitive()); + quad_->primitive(), false); // Create the shader we can reuse for solid rendering. source = std::make_unique(); @@ -488,7 +488,7 @@ bool Engine::CreateRenderResources() { return false; } solid_shader_->Create(std::move(source), quad_->vertex_description(), - quad_->primitive()); + quad_->primitive(), false); return true; } diff --git a/src/engine/renderer/opengl/render_command.h b/src/engine/renderer/opengl/render_command.h index 8ce4941..e6fff3e 100644 --- a/src/engine/renderer/opengl/render_command.h +++ b/src/engine/renderer/opengl/render_command.h @@ -80,6 +80,7 @@ RENDER_COMMAND_BEGIN(CmdCreateShader) std::unique_ptr source; VertexDescripton vertex_description; std::shared_ptr impl_data; + bool enable_depth_test; RENDER_COMMAND_END RENDER_COMMAND_BEGIN(CmdDestroyShader) diff --git a/src/engine/renderer/opengl/renderer_opengl.cc b/src/engine/renderer/opengl/renderer_opengl.cc index 3f5b447..a03c061 100644 --- a/src/engine/renderer/opengl/renderer_opengl.cc +++ b/src/engine/renderer/opengl/renderer_opengl.cc @@ -88,11 +88,13 @@ void RendererOpenGL::ActivateTexture(std::shared_ptr impl_data) { void RendererOpenGL::CreateShader(std::shared_ptr impl_data, std::unique_ptr source, const VertexDescripton& vertex_description, - Primitive primitive) { + Primitive primitive, + bool enable_depth_test) { auto cmd = std::make_unique(); cmd->source = std::move(source); cmd->vertex_description = vertex_description; cmd->impl_data = impl_data; + cmd->enable_depth_test = enable_depth_test; EnqueueCommand(std::move(cmd)); } @@ -726,7 +728,7 @@ void RendererOpenGL::HandleCmdCreateShader(RenderCommand* cmd) { } } - *impl_data = {id, {}}; + *impl_data = {id, {}, c->enable_depth_test}; } void RendererOpenGL::HandleCmdDestroyShader(RenderCommand* cmd) { @@ -744,6 +746,10 @@ void RendererOpenGL::HandleCmdActivateShader(RenderCommand* cmd) { if (impl_data->id > 0 && impl_data->id != active_shader_id_) { glUseProgram(impl_data->id); active_shader_id_ = impl_data->id; + if (impl_data->enable_depth_test) + glEnable(GL_DEPTH_TEST); + else + glDisable(GL_DEPTH_TEST); } } diff --git a/src/engine/renderer/opengl/renderer_opengl.h b/src/engine/renderer/opengl/renderer_opengl.h index 178da4a..4a0e0dd 100644 --- a/src/engine/renderer/opengl/renderer_opengl.h +++ b/src/engine/renderer/opengl/renderer_opengl.h @@ -63,7 +63,8 @@ class RendererOpenGL : public Renderer { void CreateShader(std::shared_ptr impl_data, std::unique_ptr source, const VertexDescripton& vertex_description, - Primitive primitive) override; + Primitive primitive, + bool enable_depth_test) override; void DestroyShader(std::shared_ptr impl_data) override; void ActivateShader(std::shared_ptr impl_data) override; @@ -122,6 +123,7 @@ class RendererOpenGL : public Renderer { struct ShaderOpenGL { GLuint id = 0; std::unordered_map uniforms; + bool enable_depth_test = false; }; struct TextureOpenGL { diff --git a/src/engine/renderer/renderer.h b/src/engine/renderer/renderer.h index 890bec8..59e735e 100644 --- a/src/engine/renderer/renderer.h +++ b/src/engine/renderer/renderer.h @@ -53,7 +53,8 @@ class Renderer { virtual void CreateShader(std::shared_ptr impl_data, std::unique_ptr source, const VertexDescripton& vertex_description, - Primitive primitive) = 0; + Primitive primitive, + bool enable_depth_test) = 0; virtual void DestroyShader(std::shared_ptr impl_data) = 0; virtual void ActivateShader(std::shared_ptr impl_data) = 0; diff --git a/src/engine/renderer/shader.cc b/src/engine/renderer/shader.cc index 04c4308..25e4c8e 100644 --- a/src/engine/renderer/shader.cc +++ b/src/engine/renderer/shader.cc @@ -18,10 +18,12 @@ Shader::~Shader() { void Shader::Create(std::unique_ptr source, const VertexDescripton& vd, - Primitive primitive) { + Primitive primitive, + bool enable_depth_test) { Destroy(); valid_ = true; - renderer_->CreateShader(impl_data_, std::move(source), vd, primitive); + renderer_->CreateShader(impl_data_, std::move(source), vd, primitive, + enable_depth_test); } void Shader::Destroy() { diff --git a/src/engine/renderer/shader.h b/src/engine/renderer/shader.h index 6429b53..8d2b620 100644 --- a/src/engine/renderer/shader.h +++ b/src/engine/renderer/shader.h @@ -22,7 +22,8 @@ class Shader : public RenderResource { void Create(std::unique_ptr source, const VertexDescripton& vd, - Primitive primitive); + Primitive primitive, + bool enable_depth_test); void Destroy() override; diff --git a/src/engine/renderer/vulkan/renderer_vulkan.cc b/src/engine/renderer/vulkan/renderer_vulkan.cc index fd34e86..fe1a179 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.cc +++ b/src/engine/renderer/vulkan/renderer_vulkan.cc @@ -394,7 +394,8 @@ void RendererVulkan::ActivateTexture(std::shared_ptr impl_data) { void RendererVulkan::CreateShader(std::shared_ptr impl_data, std::unique_ptr source, const VertexDescripton& vertex_description, - Primitive primitive) { + Primitive primitive, + bool enable_depth_test) { auto shader = reinterpret_cast(impl_data.get()); auto it = spirv_cache_.find(source->name()); @@ -536,8 +537,8 @@ void RendererVulkan::CreateShader(std::shared_ptr impl_data, VkPipelineDepthStencilStateCreateInfo depth_stencil{}; depth_stencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - depth_stencil.depthTestEnable = VK_TRUE; - depth_stencil.depthWriteEnable = VK_TRUE; + depth_stencil.depthTestEnable = enable_depth_test ? VK_TRUE : VK_FALSE; + depth_stencil.depthWriteEnable = enable_depth_test ? VK_TRUE : VK_FALSE; depth_stencil.depthCompareOp = VK_COMPARE_OP_LESS; depth_stencil.depthBoundsTestEnable = VK_FALSE; depth_stencil.stencilTestEnable = VK_FALSE; diff --git a/src/engine/renderer/vulkan/renderer_vulkan.h b/src/engine/renderer/vulkan/renderer_vulkan.h index 5b6c684..91e46f2 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.h +++ b/src/engine/renderer/vulkan/renderer_vulkan.h @@ -46,7 +46,8 @@ class RendererVulkan : public Renderer { void CreateShader(std::shared_ptr impl_data, std::unique_ptr source, const VertexDescripton& vertex_description, - Primitive primitive) override; + Primitive primitive, + bool enable_depth_test) override; void DestroyShader(std::shared_ptr impl_data) override; void ActivateShader(std::shared_ptr impl_data) override;