#define GLFW_INCLUDE_NONE #include "XCEngine/RHI/OpenGL/OpenGLPipelineState.h" #include #include namespace XCEngine { namespace RHI { OpenGLPipelineState::OpenGLPipelineState() { m_clearColor[0] = 0.1f; m_clearColor[1] = 0.1f; m_clearColor[2] = 0.1f; m_clearColor[3] = 1.0f; } OpenGLPipelineState::~OpenGLPipelineState() { } void OpenGLPipelineState::SetDepthStencilState(const DepthStencilState& state) { m_depthStencilState = state; } void OpenGLPipelineState::SetBlendState(const BlendState& state) { m_blendState = state; } void OpenGLPipelineState::SetRasterizerState(const RasterizerState& state) { m_rasterizerState = state; } void OpenGLPipelineState::SetViewport(const ViewportState& state) { m_viewportState = state; } static unsigned int ToGLComparisonFunc(ComparisonFunc func) { switch (func) { case ComparisonFunc::Never: return GL_NEVER; case ComparisonFunc::Less: return GL_LESS; case ComparisonFunc::Equal: return GL_EQUAL; case ComparisonFunc::LessEqual: return GL_LEQUAL; case ComparisonFunc::Greater: return GL_GREATER; case ComparisonFunc::NotEqual: return GL_NOTEQUAL; case ComparisonFunc::GreaterEqual: return GL_GEQUAL; case ComparisonFunc::Always: return GL_ALWAYS; default: return GL_LESS; } } static unsigned int ToGLBlendFactor(BlendFactor factor) { switch (factor) { case BlendFactor::Zero: return GL_ZERO; case BlendFactor::One: return GL_ONE; case BlendFactor::SrcColor: return GL_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return GL_ONE_MINUS_SRC_COLOR; case BlendFactor::DstColor: return GL_DST_COLOR; case BlendFactor::OneMinusDstColor: return GL_ONE_MINUS_DST_COLOR; case BlendFactor::SrcAlpha: return GL_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA; case BlendFactor::DstAlpha: return GL_DST_ALPHA; case BlendFactor::OneMinusDstAlpha: return GL_ONE_MINUS_DST_ALPHA; case BlendFactor::ConstantColor: return GL_CONSTANT_COLOR; case BlendFactor::OneMinusConstantColor: return GL_ONE_MINUS_CONSTANT_COLOR; case BlendFactor::ConstantAlpha: return GL_CONSTANT_ALPHA; case BlendFactor::OneMinusConstantAlpha: return GL_ONE_MINUS_CONSTANT_ALPHA; default: return GL_ONE; } } static unsigned int ToGLCullFace(CullFace face) { switch (face) { case CullFace::Front: return GL_FRONT; case CullFace::Back: return GL_BACK; case CullFace::FrontAndBack: return GL_FRONT_AND_BACK; default: return GL_BACK; } } static unsigned int ToGLFrontFace(FrontFace face) { switch (face) { case FrontFace::Clockwise: return GL_CW; case FrontFace::CounterClockwise: return GL_CCW; default: return GL_CCW; } } void OpenGLPipelineState::Apply() { if (m_depthStencilState.depthTestEnable) { glEnable(GL_DEPTH_TEST); glDepthFunc(ToGLComparisonFunc(m_depthStencilState.depthFunc)); glDepthMask(m_depthStencilState.depthWriteEnable ? GL_TRUE : GL_FALSE); } else { glDisable(GL_DEPTH_TEST); } if (m_blendState.blendEnable) { glEnable(GL_BLEND); glBlendFunc( ToGLBlendFactor(m_blendState.srcBlend), ToGLBlendFactor(m_blendState.dstBlend) ); glBlendFuncSeparate( ToGLBlendFactor(m_blendState.srcBlend), ToGLBlendFactor(m_blendState.dstBlend), ToGLBlendFactor(m_blendState.srcBlendAlpha), ToGLBlendFactor(m_blendState.dstBlendAlpha) ); } else { glDisable(GL_BLEND); } if (m_rasterizerState.cullFaceEnable) { glEnable(GL_CULL_FACE); glCullFace(ToGLCullFace(m_rasterizerState.cullFace)); glFrontFace(ToGLFrontFace(m_rasterizerState.frontFace)); } else { glDisable(GL_CULL_FACE); } glViewport( m_viewportState.x, m_viewportState.y, m_viewportState.width, m_viewportState.height ); glDepthRange(m_viewportState.minDepth, m_viewportState.maxDepth); } void OpenGLPipelineState::SetClearColor(float r, float g, float b, float a) { m_clearColor[0] = r; m_clearColor[1] = g; m_clearColor[2] = b; m_clearColor[3] = a; glClearColor(r, g, b, a); } void OpenGLPipelineState::Clear(unsigned int buffers) { unsigned int glBuffers = 0; if (buffers & 0x1) glBuffers |= GL_COLOR_BUFFER_BIT; if (buffers & 0x2) glBuffers |= GL_DEPTH_BUFFER_BIT; if (buffers & 0x4) glBuffers |= GL_STENCIL_BUFFER_BIT; glClear(glBuffers); } } // namespace RHI } // namespace XCEngine