Renderer: Add proper support for blending

This commit is contained in:
Jérôme Leclercq
2021-05-14 01:50:46 +02:00
parent 61dbd91346
commit adbf1e1da0
13 changed files with 207 additions and 99 deletions

View File

@@ -439,12 +439,24 @@ namespace Nz::GL
if (renderStates.blending)
{
if (m_state.renderStates.dstBlend != renderStates.dstBlend ||
m_state.renderStates.srcBlend != renderStates.srcBlend)
auto& currentBlend = m_state.renderStates.blend;
const auto& targetBlend = renderStates.blend;
if (currentBlend.modeColor != targetBlend.modeColor || currentBlend.modeAlpha != targetBlend.modeAlpha)
{
glBlendFunc(ToOpenGL(renderStates.srcBlend), ToOpenGL(renderStates.dstBlend));
m_state.renderStates.dstBlend = renderStates.dstBlend;
m_state.renderStates.srcBlend = renderStates.srcBlend;
glBlendEquationSeparate(ToOpenGL(targetBlend.modeColor), ToOpenGL(targetBlend.modeAlpha));
currentBlend.modeAlpha = targetBlend.modeAlpha;
currentBlend.modeColor = targetBlend.modeColor;
}
if (currentBlend.dstAlpha != targetBlend.dstAlpha || currentBlend.dstColor != targetBlend.dstColor ||
currentBlend.srcAlpha != targetBlend.srcAlpha || currentBlend.srcColor != targetBlend.srcColor)
{
glBlendFuncSeparate(ToOpenGL(targetBlend.srcColor), ToOpenGL(targetBlend.dstColor), ToOpenGL(targetBlend.srcAlpha), ToOpenGL(targetBlend.dstAlpha));
currentBlend.dstAlpha = targetBlend.dstAlpha;
currentBlend.dstColor = targetBlend.dstColor;
currentBlend.srcAlpha = targetBlend.srcAlpha;
currentBlend.srcColor = targetBlend.srcColor;
}
}

View File

@@ -140,8 +140,12 @@ namespace Nz
// Some default settings
data.SetParameter(MaterialData::Blending, true);
data.SetParameter(MaterialData::DepthWrite, true);
data.SetParameter(MaterialData::DstBlend, static_cast<long long>(BlendFunc_InvSrcAlpha));
data.SetParameter(MaterialData::SrcBlend, static_cast<long long>(BlendFunc_SrcAlpha));
data.SetParameter(MaterialData::BlendDstAlpha, static_cast<long long>(BlendFunc::Zero));
data.SetParameter(MaterialData::BlendDstColor, static_cast<long long>(BlendFunc::InvSrcAlpha));
data.SetParameter(MaterialData::BlendModeAlpha, static_cast<long long>(BlendEquation::Add));
data.SetParameter(MaterialData::BlendModeColor, static_cast<long long>(BlendEquation::Add));
data.SetParameter(MaterialData::BlendSrcAlpha, static_cast<long long>(BlendFunc::One));
data.SetParameter(MaterialData::BlendSrcColor, static_cast<long long>(BlendFunc::SrcAlpha));
}
it = materialCache.emplace(matName, std::move(data)).first;

View File

@@ -57,11 +57,12 @@ namespace Nz
if (pipelineInfo.blending)
{
//TODO
/*switch (pipelineInfo.dstBlend)
{
blendState.dstAlphaBlendFactor
}*/
colorBlendState.srcColorBlendFactor = ToVulkan(pipelineInfo.blend.srcColor);
colorBlendState.dstColorBlendFactor = ToVulkan(pipelineInfo.blend.dstColor);
colorBlendState.colorBlendOp = ToVulkan(pipelineInfo.blend.modeColor);
colorBlendState.srcAlphaBlendFactor = ToVulkan(pipelineInfo.blend.srcAlpha);
colorBlendState.dstAlphaBlendFactor = ToVulkan(pipelineInfo.blend.dstAlpha);
colorBlendState.alphaBlendOp = ToVulkan(pipelineInfo.blend.modeAlpha);
}
else
{