+ Bloom effect + PixelInformation + Many Summaries + Add-methods for CVectors + Exposure-Field in GenericCamera for HDR. ~ ColorAttachments now can have PixelInformation ~ Transformed MeshAttributes to a own class ~ Fixed the non-applying of transformations at texts ~ Added more information to the context ~ Improved Pipeline-Process. ~ Changed how Uniform takes arrays - Light system
82 lines
No EOL
2.9 KiB
C#
82 lines
No EOL
2.9 KiB
C#
using System.ComponentModel;
|
|
using OpenTK.Graphics.OpenGL4;
|
|
using SM.Base.Contexts;
|
|
using SM.Base.PostProcess;
|
|
using SM.OGL.Framebuffer;
|
|
using SM.OGL.Texture;
|
|
using SM.Utility;
|
|
|
|
namespace SM.Base.PostEffects
|
|
{
|
|
public class BloomEffect : PostProcessEffect
|
|
{
|
|
private Framebuffer _bloomBuffer1;
|
|
private Framebuffer _bloomBuffer2;
|
|
|
|
private ColorAttachment _xBuffer;
|
|
private ColorAttachment _yBuffer;
|
|
|
|
private PostProcessShader _shader = new PostProcessShader(AssemblyUtility.ReadAssemblyFile("SM.Base.PostEffects.Shaders.bloom_blur.glsl"));
|
|
private PostProcessShader _mergeShader = new PostProcessShader(AssemblyUtility.ReadAssemblyFile("SM.Base.PostEffects.Shaders.bloom_merge.glsl"));
|
|
|
|
private int _bloomLocation;
|
|
private bool _hdr;
|
|
|
|
public int Iterations = 5;
|
|
|
|
public float[] Weights = { 0.227027f, 0.1945946f, 0.1216216f, 0.054054f, 0.016216f };
|
|
|
|
public BloomEffect(int bloomLocation, bool hdr = false)
|
|
{
|
|
_bloomLocation = bloomLocation;
|
|
_hdr = hdr;
|
|
}
|
|
|
|
protected override void InitProcess()
|
|
{
|
|
Pipeline.MainFramebuffer.Append("bloom", new ColorAttachment(_bloomLocation, PixelInformation.RGBA_HDR));
|
|
|
|
_bloomBuffer1 = new Framebuffer(SMRenderer.CurrentWindow);
|
|
_bloomBuffer1.Append("xBuffer", _xBuffer = new ColorAttachment(0, PixelInformation.RGBA_HDR));
|
|
_bloomBuffer1.Compile();
|
|
_bloomBuffer2 = new Framebuffer(SMRenderer.CurrentWindow);
|
|
_bloomBuffer2.Append("yBuffer", _yBuffer = new ColorAttachment(0, PixelInformation.RGBA_HDR));
|
|
_bloomBuffer2.Compile();
|
|
|
|
Pipeline.Framebuffers.Add(_bloomBuffer1);
|
|
Pipeline.Framebuffers.Add(_bloomBuffer2);
|
|
}
|
|
|
|
public override void Draw(DrawContext context)
|
|
{
|
|
Framebuffer target = Framebuffer.GetCurrentlyActive();
|
|
|
|
bool first = true, hoz = true;
|
|
int iter = Iterations * 2;
|
|
for (int i = 0; i < iter; i++)
|
|
{
|
|
(hoz ? _bloomBuffer1 : _bloomBuffer2).Activate();
|
|
|
|
_shader.Draw(first ? Pipeline.MainFramebuffer.ColorAttachments["bloom"] : (hoz ? _yBuffer : _xBuffer), collection =>
|
|
{
|
|
collection["Horizontal"].SetUniform1(hoz);
|
|
|
|
collection["Weights"].SetUniform1(Weights);
|
|
collection["WeightCount"].SetUniform1(Weights.Length);
|
|
});
|
|
|
|
hoz = !hoz;
|
|
if (first) first = false;
|
|
}
|
|
|
|
target.Activate();
|
|
_mergeShader.Draw(Pipeline.MainFramebuffer.ColorAttachments["color"], collection =>
|
|
{
|
|
collection["Bloom"].SetTexture(_yBuffer);
|
|
|
|
collection["Exposure"].SetUniform1(context.UsedCamera.Exposure);
|
|
collection["HDR"].SetUniform1(_hdr);
|
|
});
|
|
}
|
|
}
|
|
} |