Tweaking bloom some more
This commit is contained in:
parent
f3d709a48d
commit
34b393334c
6 changed files with 67 additions and 62 deletions
2
Makefile
2
Makefile
|
@ -1,4 +1,4 @@
|
||||||
CXXFLAGS += $(shell sdl2-config --cflags) -std=c++14 -Wall
|
CXXFLAGS += $(shell sdl2-config --cflags) -std=c++14 -Wall -g
|
||||||
CFLAGS += $(shell sdl2-config --cflags)
|
CFLAGS += $(shell sdl2-config --cflags)
|
||||||
CPPFLAGS += -I. -Iimgui -Iglm \
|
CPPFLAGS += -I. -Iimgui -Iglm \
|
||||||
-DREAL_BUILD -DGLM_ENABLE_EXPERIMENTAL
|
-DREAL_BUILD -DGLM_ENABLE_EXPERIMENTAL
|
||||||
|
|
|
@ -12,11 +12,13 @@ void main( void )
|
||||||
vec2 tmp = gl_FragCoord.xy / u_OutputSize;
|
vec2 tmp = gl_FragCoord.xy / u_OutputSize;
|
||||||
float f = u_Parameters.x;
|
float f = u_Parameters.x;
|
||||||
color = textureLod( u_MainInput , tmp , 0 ).rgb;
|
color = textureLod( u_MainInput , tmp , 0 ).rgb;
|
||||||
|
vec3 bloom = vec3( 0 );
|
||||||
for ( int i = 0 ; i < 5 ; i ++ ) {
|
for ( int i = 0 ; i < 5 ; i ++ ) {
|
||||||
color += f * textureLod( u_BlurInput , tmp , i ).rgb;
|
bloom += f * textureLod( u_BlurInput , tmp , i ).rgb;
|
||||||
f *= u_Parameters.y;
|
f = pow( f , u_Parameters.y + 1 );
|
||||||
}
|
}
|
||||||
|
color = color + bloom / 2.2;
|
||||||
|
|
||||||
color = color / ( color + 1. );
|
color = color / ( color + 1. );
|
||||||
color = pow( color , vec3( 2.2 ) );
|
color = pow( color , vec3( 1.0 / 2.2 ) );
|
||||||
}
|
}
|
||||||
|
|
70
bloom.cc
70
bloom.cc
|
@ -12,12 +12,10 @@ T_BloomPass::T_BloomPass(
|
||||||
__rw__ T_Texture& input )
|
__rw__ T_Texture& input )
|
||||||
: input_( input ) ,
|
: input_( input ) ,
|
||||||
spHighpass_( GL_FRAGMENT_SHADER , watcher ) ,
|
spHighpass_( GL_FRAGMENT_SHADER , watcher ) ,
|
||||||
|
spDownsample_( GL_FRAGMENT_SHADER , watcher ) ,
|
||||||
spBlur_( GL_FRAGMENT_SHADER , watcher ) ,
|
spBlur_( GL_FRAGMENT_SHADER , watcher ) ,
|
||||||
spCombine_( GL_FRAGMENT_SHADER , watcher ) ,
|
spCombine_( GL_FRAGMENT_SHADER , watcher ) ,
|
||||||
//
|
//
|
||||||
txInput_( width , height , E_TexType::RGB16F ) ,
|
|
||||||
rtInput_( T_RendertargetSetup( ).add( txInput_ , 0 ).create( ) ) ,
|
|
||||||
//
|
|
||||||
txBlur0_( width , height , E_TexType::RGB16F , BloomLevels ) ,
|
txBlur0_( width , height , E_TexType::RGB16F , BloomLevels ) ,
|
||||||
txBlur1_( width , height , E_TexType::RGB16F , BloomLevels ) ,
|
txBlur1_( width , height , E_TexType::RGB16F , BloomLevels ) ,
|
||||||
//
|
//
|
||||||
|
@ -27,7 +25,6 @@ T_BloomPass::T_BloomPass(
|
||||||
combineStrength_( 0.7 ) ,
|
combineStrength_( 0.7 ) ,
|
||||||
combineAttenuation_( 0.3 )
|
combineAttenuation_( 0.3 )
|
||||||
{
|
{
|
||||||
txInput_.wrap( E_TexWrap::CLAMP_BORDER ).samplingMode( E_TexSampling::LINEAR );
|
|
||||||
txBlur0_.wrap( E_TexWrap::CLAMP_EDGE ).samplingMode( E_TexSampling::LINEAR );
|
txBlur0_.wrap( E_TexWrap::CLAMP_EDGE ).samplingMode( E_TexSampling::LINEAR );
|
||||||
txBlur1_.wrap( E_TexWrap::CLAMP_EDGE ).samplingMode( E_TexSampling::LINEAR );
|
txBlur1_.wrap( E_TexWrap::CLAMP_EDGE ).samplingMode( E_TexSampling::LINEAR );
|
||||||
|
|
||||||
|
@ -37,10 +34,12 @@ T_BloomPass::T_BloomPass(
|
||||||
}
|
}
|
||||||
|
|
||||||
spHighpass_.addFile( "bloom-highpass.glsl" );
|
spHighpass_.addFile( "bloom-highpass.glsl" );
|
||||||
|
spDownsample_.addFile( "downsample.glsl" );
|
||||||
spBlur_.addFile( "blur-pass.glsl" );
|
spBlur_.addFile( "blur-pass.glsl" );
|
||||||
spCombine_.addFile( "bloom-combine.glsl" );
|
spCombine_.addFile( "bloom-combine.glsl" );
|
||||||
|
|
||||||
spHighpass_.load( );
|
spHighpass_.load( );
|
||||||
|
spDownsample_.load( );
|
||||||
spBlur_.load( );
|
spBlur_.load( );
|
||||||
spCombine_.load( );
|
spCombine_.load( );
|
||||||
}
|
}
|
||||||
|
@ -54,7 +53,7 @@ void T_BloomPass::render( )
|
||||||
U_INPUT_SIZE = 2 ,
|
U_INPUT_SIZE = 2 ,
|
||||||
U_PARAMS = 3 ,
|
U_PARAMS = 3 ,
|
||||||
};
|
};
|
||||||
rtInput_.activate( );
|
rtBlur0_[ 0 ].activate( );
|
||||||
T_TextureBinding tb( 0 );
|
T_TextureBinding tb( 0 );
|
||||||
tb.set( U_TEXTURE , input_ );
|
tb.set( U_TEXTURE , input_ );
|
||||||
tb.bind( );
|
tb.bind( );
|
||||||
|
@ -65,56 +64,45 @@ void T_BloomPass::render( )
|
||||||
glUniform3fv( U_PARAMS , 1 , filterParams_ );
|
glUniform3fv( U_PARAMS , 1 , filterParams_ );
|
||||||
glRectf( -1, -1 , 1 , 1 );
|
glRectf( -1, -1 , 1 , 1 );
|
||||||
}
|
}
|
||||||
|
assert( glGetError( ) == GL_NO_ERROR );
|
||||||
|
|
||||||
if ( spBlur_.activate( ) ) {
|
|
||||||
enum {
|
enum {
|
||||||
U_TEXTURE = 0 ,
|
U_TEXTURE = 0 ,
|
||||||
U_OUTPUT_SIZE = 1 ,
|
U_OUTPUT_SIZE = 1 ,
|
||||||
U_INPUT_SIZE = 2 ,
|
U_SOURCE_LOD = 2 ,
|
||||||
U_SOURCE_LOD = 3 ,
|
U_DIRECTION = 3 ,
|
||||||
U_DIRECTION = 4 ,
|
U_WEIGHTS = 4 ,
|
||||||
U_WEIGHTS = 5 ,
|
|
||||||
};
|
};
|
||||||
glUniform4fv( U_WEIGHTS , 1 , blurWeights_ );
|
for ( auto i = 0u ; i < BloomLevels ; i ++ ) {
|
||||||
for ( int i = 0 ; i < 5 ; i ++ ) {
|
|
||||||
// IB RMO B0 B1 B0 B1 B0
|
|
||||||
// OB B0/0 B1/0 B0/1 B1/1 B0/2 B1/2
|
|
||||||
// SLOD: 0 0 0 1 1 2
|
|
||||||
// IW: W W W W/2 W/2 W/4
|
|
||||||
// OW: W W W/2 W/2 W/4 W/4
|
|
||||||
T_TextureBinding tb( 0 );
|
T_TextureBinding tb( 0 );
|
||||||
uint32_t w , h;
|
if ( i > 0 ) {
|
||||||
if ( i == 0 ) {
|
spDownsample_.activate( );
|
||||||
tb.set( U_TEXTURE , txInput_ );
|
rtBlur0_[ i ].activate( );
|
||||||
w = txInput_.width( );
|
tb.set( 0 , txBlur0_ );
|
||||||
h = txInput_.height( );
|
tb.bind( );
|
||||||
} else {
|
glUniform2f( 1 , txBlur0_.width( ) >> i ,
|
||||||
tb.set( U_TEXTURE , txBlur1_ );
|
txBlur0_.height( ) >> i );
|
||||||
w = txBlur1_.width( ) >> ( i - 1 );
|
glUniform1i( 2 , i - 1 );
|
||||||
h = txBlur1_.height( ) >> ( i - 1 );
|
glRectf( -1 , -1 , 1 , 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t slod = i > 0 ? ( i - 1 ) : 0;
|
spBlur_.activate( );
|
||||||
rtBlur0_[ i ].activate( );
|
glUniform4fv( U_WEIGHTS , 1 , blurWeights_ );
|
||||||
glUniform2f( U_OUTPUT_SIZE , rtBlur0_[ i ].width( ) ,
|
glUniform2f( U_OUTPUT_SIZE , rtBlur0_[ i ].width( ) ,
|
||||||
rtBlur0_[ i ].height( ) );
|
rtBlur0_[ i ].height( ) );
|
||||||
glUniform1i( U_SOURCE_LOD , slod );
|
glUniform1i( U_SOURCE_LOD , i );
|
||||||
glUniform2f( U_INPUT_SIZE , w , h );
|
|
||||||
|
|
||||||
glUniform2f( U_DIRECTION , blurSize_ , 0 );
|
|
||||||
tb.bind( );
|
|
||||||
glRectf( -1 , -1 , 1 , 1 );
|
|
||||||
|
|
||||||
rtBlur1_[ i ].activate( );
|
rtBlur1_[ i ].activate( );
|
||||||
|
glUniform2f( U_DIRECTION , blurSize_ , 0 );
|
||||||
tb.set( U_TEXTURE , txBlur0_ );
|
tb.set( U_TEXTURE , txBlur0_ );
|
||||||
tb.bind( );
|
tb.bind( );
|
||||||
glUniform2f( U_DIRECTION , 0 , blurSize_ );
|
|
||||||
glUniform1i( U_SOURCE_LOD , i );
|
|
||||||
glUniform2f( U_INPUT_SIZE ,
|
|
||||||
rtBlur0_[ i ].width( ) ,
|
|
||||||
rtBlur0_[ i ].height( ) );
|
|
||||||
glRectf( -1 , -1 , 1 , 1 );
|
glRectf( -1 , -1 , 1 , 1 );
|
||||||
}
|
|
||||||
|
rtBlur0_[ i ].activate( );
|
||||||
|
glUniform2f( U_DIRECTION , 0 , blurSize_ );
|
||||||
|
tb.set( U_TEXTURE , txBlur1_ );
|
||||||
|
tb.bind( );
|
||||||
|
glRectf( -1 , -1 , 1 , 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
T_Rendertarget::MainOutput( );
|
T_Rendertarget::MainOutput( );
|
||||||
|
@ -124,7 +112,7 @@ void T_BloomPass::render( )
|
||||||
T_TextureBinding main( 0 ) , blur( 1 );
|
T_TextureBinding main( 0 ) , blur( 1 );
|
||||||
main.set( 0 , input_ );
|
main.set( 0 , input_ );
|
||||||
main.bind( );
|
main.bind( );
|
||||||
blur.set( 1 , txBlur1_ );
|
blur.set( 1 , txBlur0_ );
|
||||||
blur.bind( );
|
blur.bind( );
|
||||||
glUniform2f( 2 , input_.width( ) , input_.height( ) );
|
glUniform2f( 2 , input_.width( ) , input_.height( ) );
|
||||||
glUniform2f( 3 , combineStrength_ , 1 - combineAttenuation_ );
|
glUniform2f( 3 , combineStrength_ , 1 - combineAttenuation_ );
|
||||||
|
|
4
bloom.hh
4
bloom.hh
|
@ -29,12 +29,10 @@ struct T_BloomPass
|
||||||
T_Texture& input_;
|
T_Texture& input_;
|
||||||
|
|
||||||
T_ShaderProgram spHighpass_;
|
T_ShaderProgram spHighpass_;
|
||||||
|
T_ShaderProgram spDownsample_;
|
||||||
T_ShaderProgram spBlur_;
|
T_ShaderProgram spBlur_;
|
||||||
T_ShaderProgram spCombine_;
|
T_ShaderProgram spCombine_;
|
||||||
|
|
||||||
T_Texture txInput_;
|
|
||||||
T_Rendertarget rtInput_;
|
|
||||||
|
|
||||||
T_Texture txBlur0_ , txBlur1_;
|
T_Texture txBlur0_ , txBlur1_;
|
||||||
std::vector< T_Rendertarget > rtBlur0_ , rtBlur1_;
|
std::vector< T_Rendertarget > rtBlur0_ , rtBlur1_;
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,9 @@
|
||||||
|
|
||||||
layout( location = 0 ) uniform sampler2D u_InputTexture;
|
layout( location = 0 ) uniform sampler2D u_InputTexture;
|
||||||
layout( location = 1 ) uniform vec2 u_OutputSize;
|
layout( location = 1 ) uniform vec2 u_OutputSize;
|
||||||
layout( location = 2 ) uniform vec2 u_InputSize;
|
layout( location = 2 ) uniform int u_SourceLOD;
|
||||||
layout( location = 3 ) uniform int u_SourceLOD;
|
layout( location = 3 ) uniform vec2 u_Direction;
|
||||||
layout( location = 4 ) uniform vec2 u_Direction;
|
layout( location = 4 ) uniform vec4 u_Weights;
|
||||||
layout( location = 5 ) uniform vec4 u_Weights;
|
|
||||||
|
|
||||||
layout( location = 0 ) out vec3 color;
|
layout( location = 0 ) out vec3 color;
|
||||||
|
|
||||||
|
|
18
downsample.glsl
Normal file
18
downsample.glsl
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#version 450 core
|
||||||
|
|
||||||
|
layout( location = 0 ) uniform sampler2D u_InputTexture;
|
||||||
|
layout( location = 1 ) uniform vec2 u_OutputSize;
|
||||||
|
layout( location = 2 ) uniform int u_SourceLOD;
|
||||||
|
|
||||||
|
layout( location = 0 ) out vec3 color;
|
||||||
|
|
||||||
|
void main( void )
|
||||||
|
{
|
||||||
|
const vec2 c = gl_FragCoord.xy;
|
||||||
|
color = ( .25 * (
|
||||||
|
textureLod( u_InputTexture , ( c + vec2( .5 , .5 ) ) / u_OutputSize , u_SourceLOD )
|
||||||
|
+ textureLod( u_InputTexture , ( c + vec2(-.5 , .5 ) ) / u_OutputSize , u_SourceLOD )
|
||||||
|
+ textureLod( u_InputTexture , ( c + vec2( .5 ,-.5 ) ) / u_OutputSize , u_SourceLOD )
|
||||||
|
+ textureLod( u_InputTexture , ( c + vec2(-.5 ,-.5 ) ) / u_OutputSize , u_SourceLOD )
|
||||||
|
) ).rgb;
|
||||||
|
}
|
Loading…
Reference in a new issue