opengl: Implement blend state
This commit is contained in:
parent
18163f1223
commit
8dc3bd1808
|
@ -15,12 +15,90 @@
|
||||||
#include "backend/opengl/BlendStateGL.h"
|
#include "backend/opengl/BlendStateGL.h"
|
||||||
|
|
||||||
#include "backend/opengl/OpenGLBackend.h"
|
#include "backend/opengl/OpenGLBackend.h"
|
||||||
|
#include "common/Assert.h"
|
||||||
|
|
||||||
namespace backend {
|
namespace backend {
|
||||||
namespace opengl {
|
namespace opengl {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
GLenum GLBlendFactor(nxt::BlendFactor factor, bool alpha) {
|
||||||
|
switch (factor) {
|
||||||
|
case nxt::BlendFactor::Zero:
|
||||||
|
return GL_ZERO;
|
||||||
|
case nxt::BlendFactor::One:
|
||||||
|
return GL_ONE;
|
||||||
|
case nxt::BlendFactor::SrcColor:
|
||||||
|
return GL_SRC_COLOR;
|
||||||
|
case nxt::BlendFactor::OneMinusSrcColor:
|
||||||
|
return GL_ONE_MINUS_SRC_COLOR;
|
||||||
|
case nxt::BlendFactor::SrcAlpha:
|
||||||
|
return GL_SRC_ALPHA;
|
||||||
|
case nxt::BlendFactor::OneMinusSrcAlpha:
|
||||||
|
return GL_ONE_MINUS_SRC_ALPHA;
|
||||||
|
case nxt::BlendFactor::DstColor:
|
||||||
|
return GL_DST_COLOR;
|
||||||
|
case nxt::BlendFactor::OneMinusDstColor:
|
||||||
|
return GL_ONE_MINUS_DST_COLOR;
|
||||||
|
case nxt::BlendFactor::DstAlpha:
|
||||||
|
return GL_DST_ALPHA;
|
||||||
|
case nxt::BlendFactor::OneMinusDstAlpha:
|
||||||
|
return GL_ONE_MINUS_DST_ALPHA;
|
||||||
|
case nxt::BlendFactor::SrcAlphaSaturated:
|
||||||
|
return GL_SRC_ALPHA_SATURATE;
|
||||||
|
case nxt::BlendFactor::BlendColor:
|
||||||
|
return alpha ? GL_CONSTANT_ALPHA : GL_CONSTANT_COLOR;
|
||||||
|
case nxt::BlendFactor::OneMinusBlendColor:
|
||||||
|
return alpha ? GL_ONE_MINUS_CONSTANT_ALPHA : GL_ONE_MINUS_CONSTANT_COLOR;
|
||||||
|
case nxt::BlendFactor::Src1Color:
|
||||||
|
return GL_SRC1_COLOR;
|
||||||
|
case nxt::BlendFactor::OneMinusSrc1Color:
|
||||||
|
return GL_ONE_MINUS_SRC1_COLOR;
|
||||||
|
case nxt::BlendFactor::Src1Alpha:
|
||||||
|
return GL_SRC1_ALPHA;
|
||||||
|
case nxt::BlendFactor::OneMinusSrc1Alpha:
|
||||||
|
return GL_ONE_MINUS_SRC1_ALPHA;
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLenum GLBlendMode(nxt::BlendOperation operation) {
|
||||||
|
switch (operation) {
|
||||||
|
case nxt::BlendOperation::Add:
|
||||||
|
return GL_FUNC_ADD;
|
||||||
|
case nxt::BlendOperation::Subtract:
|
||||||
|
return GL_FUNC_SUBTRACT;
|
||||||
|
case nxt::BlendOperation::ReverseSubtract:
|
||||||
|
return GL_FUNC_REVERSE_SUBTRACT;
|
||||||
|
case nxt::BlendOperation::Min:
|
||||||
|
return GL_MIN;
|
||||||
|
case nxt::BlendOperation::Max:
|
||||||
|
return GL_MAX;
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BlendState::BlendState(BlendStateBuilder* builder) : BlendStateBase(builder) {
|
BlendState::BlendState(BlendStateBuilder* builder) : BlendStateBase(builder) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlendState::ApplyNow(uint32_t attachment) {
|
||||||
|
const auto& info = GetBlendInfo();
|
||||||
|
|
||||||
|
if (info.blendEnabled) {
|
||||||
|
glEnablei(GL_BLEND, attachment);
|
||||||
|
glBlendEquationSeparatei(attachment, GLBlendMode(info.colorBlend.operation), GLBlendMode(info.alphaBlend.operation));
|
||||||
|
glBlendFuncSeparatei(attachment, GLBlendFactor(info.colorBlend.srcFactor, false), GLBlendFactor(info.colorBlend.dstFactor, false), GLBlendFactor(info.alphaBlend.srcFactor, true), GLBlendFactor(info.alphaBlend.dstFactor, true));
|
||||||
|
glColorMaski(attachment,
|
||||||
|
info.colorWriteMask & nxt::ColorWriteMask::Red,
|
||||||
|
info.colorWriteMask & nxt::ColorWriteMask::Green,
|
||||||
|
info.colorWriteMask & nxt::ColorWriteMask::Blue,
|
||||||
|
info.colorWriteMask & nxt::ColorWriteMask::Alpha);
|
||||||
|
} else {
|
||||||
|
glDisablei(GL_BLEND, attachment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,12 +17,16 @@
|
||||||
|
|
||||||
#include "backend/BlendState.h"
|
#include "backend/BlendState.h"
|
||||||
|
|
||||||
|
#include "glad/glad.h"
|
||||||
|
|
||||||
namespace backend {
|
namespace backend {
|
||||||
namespace opengl {
|
namespace opengl {
|
||||||
|
|
||||||
class BlendState : public BlendStateBase {
|
class BlendState : public BlendStateBase {
|
||||||
public:
|
public:
|
||||||
BlendState(BlendStateBuilder* builder);
|
BlendState(BlendStateBuilder* builder);
|
||||||
|
|
||||||
|
void ApplyNow(uint32_t attachment);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -338,7 +338,8 @@ namespace opengl {
|
||||||
|
|
||||||
case Command::SetBlendColor:
|
case Command::SetBlendColor:
|
||||||
{
|
{
|
||||||
commands.NextCommand<SetBlendColorCmd>();
|
SetBlendColorCmd* cmd = commands.NextCommand<SetBlendColorCmd>();
|
||||||
|
glBlendColor(cmd->r, cmd->g, cmd->b, cmd->a);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "backend/opengl/RenderPipelineGL.h"
|
#include "backend/opengl/RenderPipelineGL.h"
|
||||||
|
|
||||||
|
#include "backend/opengl/BlendStateGL.h"
|
||||||
#include "backend/opengl/DepthStencilStateGL.h"
|
#include "backend/opengl/DepthStencilStateGL.h"
|
||||||
#include "backend/opengl/PersistentPipelineStateGL.h"
|
#include "backend/opengl/PersistentPipelineStateGL.h"
|
||||||
#include "backend/opengl/OpenGLBackend.h"
|
#include "backend/opengl/OpenGLBackend.h"
|
||||||
|
@ -57,6 +58,14 @@ namespace opengl {
|
||||||
|
|
||||||
auto depthStencilState = ToBackend(GetDepthStencilState());
|
auto depthStencilState = ToBackend(GetDepthStencilState());
|
||||||
depthStencilState->ApplyNow(persistentPipelineState);
|
depthStencilState->ApplyNow(persistentPipelineState);
|
||||||
|
|
||||||
|
|
||||||
|
RenderPass* renderPass = ToBackend(GetRenderPass());
|
||||||
|
auto& subpassInfo = renderPass->GetSubpassInfo(GetSubPass());
|
||||||
|
|
||||||
|
for (uint32_t attachmentSlot : IterateBitSet(subpassInfo.colorAttachmentsSet)) {
|
||||||
|
ToBackend(GetBlendState(attachmentSlot))->ApplyNow(attachmentSlot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue