Renderer: Add proper support for blending
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user