Add Min and Max blend modes

This commit is contained in:
Guillaume Bertholon 2021-03-09 00:21:56 +01:00 committed by Lukas Dürrenberger
parent 0fe1626a1f
commit 05c83617de
4 changed files with 52 additions and 13 deletions

View File

@ -68,9 +68,11 @@ struct SFML_GRAPHICS_API BlendMode
////////////////////////////////////////////////////////
enum Equation
{
Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor
Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor
ReverseSubtract //!< Pixel = Dst * DstFactor - Src * SrcFactor
Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor
Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor
ReverseSubtract, //!< Pixel = Dst * DstFactor - Src * SrcFactor
Min, //!< Pixel = min(Dst, Src)
Max //!< Pixel = max(Dst, Src)
};
////////////////////////////////////////////////////////////
@ -150,6 +152,8 @@ SFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right
SFML_GRAPHICS_API extern const BlendMode BlendAlpha; //!< Blend source and dest according to dest alpha
SFML_GRAPHICS_API extern const BlendMode BlendAdd; //!< Add source to dest
SFML_GRAPHICS_API extern const BlendMode BlendMultiply; //!< Multiply source and dest
SFML_GRAPHICS_API extern const BlendMode BlendMin; //!< Take minimum between source and dest
SFML_GRAPHICS_API extern const BlendMode BlendMax; //!< Take maximum between source and dest
SFML_GRAPHICS_API extern const BlendMode BlendNone; //!< Overwrite dest with source
} // namespace sf

View File

@ -37,8 +37,10 @@ const BlendMode BlendAlpha(BlendMode::SrcAlpha, BlendMode::OneMinusSrcAlpha, Ble
BlendMode::One, BlendMode::OneMinusSrcAlpha, BlendMode::Add);
const BlendMode BlendAdd(BlendMode::SrcAlpha, BlendMode::One, BlendMode::Add,
BlendMode::One, BlendMode::One, BlendMode::Add);
const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero);
const BlendMode BlendNone(BlendMode::One, BlendMode::Zero);
const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero, BlendMode::Add);
const BlendMode BlendMin(BlendMode::One, BlendMode::One, BlendMode::Min);
const BlendMode BlendMax(BlendMode::One, BlendMode::One, BlendMode::Max);
const BlendMode BlendNone(BlendMode::One, BlendMode::Zero, BlendMode::Add);
////////////////////////////////////////////////////////////

View File

@ -45,7 +45,6 @@
#define GLEXT_multitexture true
#define GLEXT_texture_edge_clamp true
#define GLEXT_EXT_texture_edge_clamp true
#define GLEXT_blend_minmax true
#define GLEXT_glClientActiveTexture glClientActiveTexture
#define GLEXT_glActiveTexture glActiveTexture
#define GLEXT_GL_TEXTURE0 GL_TEXTURE0
@ -140,6 +139,11 @@
#define GLEXT_texture_sRGB false
#define GLEXT_GL_SRGB8_ALPHA8 0
// Core since 3.0 - EXT_blend_minmax
#define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax
#define GLEXT_GL_MIN GL_MIN_EXT
#define GLEXT_GL_MAX GL_MAX_EXT
#else
// SFML requires at a bare minimum OpenGL 1.1 capability
@ -164,6 +168,8 @@
#define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax
#define GLEXT_glBlendEquation glBlendEquationEXT
#define GLEXT_GL_FUNC_ADD GL_FUNC_ADD_EXT
#define GLEXT_GL_MIN GL_MIN_EXT
#define GLEXT_GL_MAX GL_MAX_EXT
// Core since 1.2 - EXT_blend_subtract
#define GLEXT_blend_subtract SF_GLAD_GL_EXT_blend_subtract

View File

@ -110,13 +110,36 @@ namespace
{
switch (blendEquation)
{
case sf::BlendMode::Add: return GLEXT_GL_FUNC_ADD;
case sf::BlendMode::Subtract: return GLEXT_GL_FUNC_SUBTRACT;
case sf::BlendMode::ReverseSubtract: return GLEXT_GL_FUNC_REVERSE_SUBTRACT;
case sf::BlendMode::Add:
return GLEXT_GL_FUNC_ADD;
case sf::BlendMode::Subtract:
if (GLEXT_blend_subtract)
return GLEXT_GL_FUNC_SUBTRACT;
break;
case sf::BlendMode::ReverseSubtract:
if (GLEXT_blend_subtract)
return GLEXT_GL_FUNC_REVERSE_SUBTRACT;
break;
case sf::BlendMode::Min:
if (GLEXT_blend_minmax)
return GLEXT_GL_MIN;
break;
case sf::BlendMode::Max:
if (GLEXT_blend_minmax)
return GLEXT_GL_MAX;
break;
}
static bool warned = false;
if (!warned)
{
sf::err() << "OpenGL extension EXT_blend_minmax or EXT_blend_subtract unavailable" << std::endl;
sf::err() << "Some blending equations will fallback to sf::BlendMode::Add" << std::endl;
sf::err() << "Ensure that hardware acceleration is enabled if available" << std::endl;
warned = true;
}
sf::err() << "Invalid value for sf::BlendMode::Equation! Fallback to sf::BlendMode::Add." << std::endl;
assert(false);
return GLEXT_GL_FUNC_ADD;
}
}
@ -591,7 +614,7 @@ void RenderTarget::applyBlendMode(const BlendMode& mode)
factorToGlConstant(mode.colorDstFactor)));
}
if (GLEXT_blend_minmax && GLEXT_blend_subtract)
if (GLEXT_blend_minmax || GLEXT_blend_subtract)
{
if (GLEXT_blend_equation_separate)
{
@ -610,7 +633,11 @@ void RenderTarget::applyBlendMode(const BlendMode& mode)
if (!warned)
{
err() << "OpenGL extension EXT_blend_minmax and/or EXT_blend_subtract unavailable" << std::endl;
#ifdef SFML_OPENGL_ES
err() << "OpenGL ES extension OES_blend_subtract unavailable" << std::endl;
#else
err() << "OpenGL extension EXT_blend_minmax and EXT_blend_subtract unavailable" << std::endl;
#endif
err() << "Selecting a blend equation not possible" << std::endl;
err() << "Ensure that hardware acceleration is enabled if available" << std::endl;