Renderer: Implement and fix front face (winding order) between Vulkan / OpenGL

This commit is contained in:
Jérôme Leclercq
2021-05-28 22:58:14 +02:00
parent 299585a7de
commit ff505e9019
15 changed files with 71 additions and 30 deletions

View File

@@ -363,6 +363,8 @@ namespace Nz::GL
glGetIntegerv(GL_VIEWPORT, res.data());
m_state.viewport = { res[0], res[1], res[2], res[3] };
m_state.renderStates.frontFace = FrontFace::CounterClockwise; //< OpenGL default front face is counter-clockwise
EnableVerticalSync(false);
return true;
@@ -435,7 +437,7 @@ namespace Nz::GL
}
}
void Context::UpdateStates(const RenderStates& renderStates) const
void Context::UpdateStates(const RenderStates& renderStates, bool isViewportFlipped) const
{
if (!SetCurrentContext(this))
throw std::runtime_error("failed to activate context");
@@ -482,11 +484,21 @@ namespace Nz::GL
{
if (m_state.renderStates.cullingSide != renderStates.cullingSide)
{
glCullFace(ToOpenGL(m_state.renderStates.cullingSide));
glCullFace(ToOpenGL(renderStates.cullingSide));
m_state.renderStates.cullingSide = renderStates.cullingSide;
}
}
FrontFace targetFrontFace = renderStates.frontFace;
if (!isViewportFlipped)
targetFrontFace = (targetFrontFace == FrontFace::Clockwise) ? FrontFace::CounterClockwise : FrontFace::Clockwise;
if (m_state.renderStates.frontFace != targetFrontFace)
{
glFrontFace(ToOpenGL(targetFrontFace));
m_state.renderStates.frontFace = targetFrontFace;
}
/*
TODO: Use glPolyonMode if available (OpenGL)
if (m_state.renderStates.faceFilling != renderStates.faceFilling)