Add Bloom effect

This commit is contained in:
Ricardo Matias
2020-01-07 13:29:40 +01:00
parent 49b34ed902
commit 6c2692fb63
2 changed files with 99 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
package org.openrndr.extra.fx.color
import org.openrndr.draw.*
import org.openrndr.extra.fx.blend.Add
import org.openrndr.extra.fx.blur.ApproximateGaussianBlur
import org.openrndr.extra.fx.filterFragmentCode
class Bloom(blur: Filter = ApproximateGaussianBlur()) : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("color/bloom.frag"))) {
/**
* the blur filter to use for the bloom, default is Approximate Gaussian Blur
*/
var blur: Filter = blur
/**
* number of downsampled textures to use, default value is 2
*/
var downsamples: Int = 2
/**
* rate of downsampling, f.ex: 4 -> 4x, 8x, 16x.., default value is 2
*/
var downsampleRate: Int = 2
/**
* blending amount between original image and blurred, default value is 0.5
*/
var blendFactor: Double by parameters
/**
* brightness of the resulting image, default value is 0.5
*/
var brightness: Double by parameters
init {
blendFactor = 0.5
brightness = 0.5
}
private val samplers: MutableList<Pair<ColorBuffer, ColorBuffer>> = mutableListOf()
private var lastDownsampleRate = 0
private val blendAdd = Add()
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
val src = source[0]
val dest = target[0]
if (samplers.isEmpty() || samplers.size != downsamples || lastDownsampleRate != downsampleRate) {
samplers.clear()
lastDownsampleRate = downsampleRate
for (downsample in 0 until downsamples * 2 step 2) {
val bufferA = colorBuffer(dest.width, dest.height, 1.0 / (downsample + downsampleRate), target[0].format, ColorType.FLOAT16)
val bufferB = colorBuffer(dest.width, dest.height, 1.0 / (downsample + downsampleRate), target[0].format, ColorType.FLOAT16)
samplers.add(Pair(bufferA, bufferB))
}
}
for ((bufferA) in samplers) {
blur.apply(src, bufferA)
}
for ((index, buffers) in samplers.asReversed().withIndex()) {
val (bufferCurrA) = buffers
if (index + 1 <= samplers.lastIndex) {
val (bufferNextA, bufferNextB) = samplers.asReversed()[index + 1]
blur.apply(bufferCurrA, bufferNextB)
blendAdd.apply(arrayOf(bufferNextA, bufferNextB), bufferNextA)
} else {
super.apply(arrayOf(src, bufferCurrA), target)
}
}
}
}

View File

@@ -0,0 +1,20 @@
#version 330
in vec2 v_texCoord0;
out vec4 o_color;
uniform sampler2D tex0;
uniform sampler2D tex1;
uniform float blendFactor;
uniform float brightness;
void main() {
vec3 original = texture(tex0, v_texCoord0).rgb;
vec3 bloom = texture(tex1, v_texCoord0).rgb;
vec3 hdrColor = mix(original, bloom, blendFactor);
vec3 result = vec3(1.0) - exp(-hdrColor * brightness);
o_color = vec4(result, 1.0);
}