Skip to content

Commit

Permalink
🛠️ Allow custom blend modes in pipeline
Browse files Browse the repository at this point in the history
  • Loading branch information
paulcscharf committed Jul 22, 2024
1 parent 88dfdb7 commit e491ec1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
29 changes: 17 additions & 12 deletions Bearded.Graphics/Pipelines/Context/BlendMode.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
namespace Bearded.Graphics.Pipelines.Context
using OpenTK.Graphics.OpenGL;
using static OpenTK.Graphics.OpenGL.BlendingFactor;
using static OpenTK.Graphics.OpenGL.BlendEquationMode;

namespace Bearded.Graphics.Pipelines.Context;

public readonly record struct BlendMode(
BlendingFactor Source, BlendingFactor Destination, BlendEquationMode Function)
{
public enum BlendMode
{
None = 0,
Alpha,
Add,
Subtract,
Multiply,
Premultiplied,
Min,
Max,
}
public static BlendMode Disable => default;

public static BlendMode Alpha => new(SrcAlpha, OneMinusSrcAlpha, FuncAdd);
public static BlendMode Add => new(SrcAlpha, One, FuncAdd);
public static BlendMode Subtract => new(SrcAlpha, One, FuncReverseSubtract);
public static BlendMode Multiply => new(Zero, SrcColor, FuncAdd);
public static BlendMode Premultiplied => new(One, OneMinusSrcAlpha, FuncAdd);
public static BlendMode Min => new(One, One, BlendEquationMode.Min);
public static BlendMode Max => new(One, One, BlendEquationMode.Max);
}
18 changes: 2 additions & 16 deletions Bearded.Graphics/Pipelines/Context/GLState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
using System.Drawing;
using OpenTK.Graphics.OpenGL;
using static Bearded.Graphics.Pipelines.Context.CullMode;
using static OpenTK.Graphics.OpenGL.BlendEquationMode;
using static OpenTK.Graphics.OpenGL.BlendingFactor;

namespace Bearded.Graphics.Pipelines.Context
{
Expand Down Expand Up @@ -53,27 +51,15 @@ public static void SetBlendMode(BlendMode mode)
{
BlendMode = mode;

if (mode == BlendMode.None)
if (mode == BlendMode.Disable)
{
GL.Disable(EnableCap.Blend);
return;
}

GL.Enable(EnableCap.Blend);

// TODO: refactor to work similarly to depth mode to make more flexible
var (src, dst, equation) = mode switch
{
BlendMode.Alpha => (SrcAlpha, OneMinusSrcAlpha, FuncAdd),
BlendMode.Add => (SrcAlpha, One, FuncAdd),
BlendMode.Subtract => (SrcAlpha, One, FuncReverseSubtract),
BlendMode.Multiply => (Zero, SrcColor, FuncAdd),
BlendMode.Premultiplied => (One, OneMinusSrcAlpha, FuncAdd),
BlendMode.Min => (One, One, Min),
BlendMode.Max => (One, One, Max),
BlendMode.None => throw new InvalidOperationException(),
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null)
};
var (src, dst, equation) = mode;

GL.BlendFunc(src, dst);
GL.BlendEquation(equation);
Expand Down

0 comments on commit e491ec1

Please sign in to comment.