@@ -18,7 +18,7 @@ const fragmentShader = `
1818 uniform vec3 brightnessContrastSaturation;
1919
2020 // for all parameters, 1.0 is the no-change value
21- vec3 ContrastSaturationBrightness (vec3 color, float brt, float sat, float con)
21+ vec3 contrastSaturationBrightness (vec3 color, float brt, float sat, float con)
2222 {
2323 color = color * brt;
2424 float grey = dot(color, vec3(0.3, 0.59, 0.11));
@@ -28,6 +28,29 @@ const fragmentShader = `
2828
2929 #endif
3030
31+ #ifdef VIGNETTE
32+
33+ uniform vec4 vignetterParams;
34+
35+ float vignette(vec2 uv) {
36+
37+ float inner = vignetterParams.x;
38+ float outer = vignetterParams.y;
39+ float curvature = vignetterParams.z;
40+ float intensity = vignetterParams.w;
41+
42+ // edge curvature
43+ vec2 curve = pow(abs(uv * 2.0 -1.0), vec2(1.0 / curvature));
44+
45+ // distance to edge
46+ float edge = pow(length(curve), curvature);
47+
48+ // gradient and intensity
49+ return 1.0 - intensity * smoothstep(inner, outer, edge);
50+ }
51+
52+ #endif
53+
3154 void main() {
3255 vec4 scene = texture2D(sceneTexture, uv0);
3356 vec3 result = scene.rgb;
@@ -38,10 +61,15 @@ const fragmentShader = `
3861 #endif
3962
4063 #ifdef GRADING
41- result = ContrastSaturationBrightness (result, brightnessContrastSaturation.x, brightnessContrastSaturation.z, brightnessContrastSaturation.y);
64+ result = contrastSaturationBrightness (result, brightnessContrastSaturation.x, brightnessContrastSaturation.z, brightnessContrastSaturation.y);
4265 #endif
4366
4467 result = toneMap(result);
68+
69+ #ifdef VIGNETTE
70+ result *= vignette(uv0);
71+ #endif
72+
4573 result = gammaCorrectOutput(result);
4674
4775 gl_FragColor = vec4(result, scene.a);
@@ -67,6 +95,16 @@ class RenderPassCompose extends RenderPassShaderQuad {
6795
6896 _shaderDirty = true ;
6997
98+ _vignetteEnabled = false ;
99+
100+ vignetteInner = 0.5 ;
101+
102+ vignetteOuter = 1.0 ;
103+
104+ vignetteCurvature = 0.5 ;
105+
106+ vignetteIntensity = 0.3 ;
107+
70108 _key = '' ;
71109
72110 constructor ( graphicsDevice ) {
@@ -76,6 +114,7 @@ class RenderPassCompose extends RenderPassShaderQuad {
76114 this . bloomTextureId = graphicsDevice . scope . resolve ( 'bloomTexture' ) ;
77115 this . bloomIntensityId = graphicsDevice . scope . resolve ( 'bloomIntensity' ) ;
78116 this . bcsId = graphicsDevice . scope . resolve ( 'brightnessContrastSaturation' ) ;
117+ this . vignetterParamsId = graphicsDevice . scope . resolve ( 'vignetterParams' ) ;
79118 }
80119
81120 set bloomTexture ( value ) {
@@ -100,6 +139,17 @@ class RenderPassCompose extends RenderPassShaderQuad {
100139 return this . _gradingEnabled ;
101140 }
102141
142+ set vignetteEnabled ( value ) {
143+ if ( this . _vignetteEnabled !== value ) {
144+ this . _vignetteEnabled = value ;
145+ this . _shaderDirty = true ;
146+ }
147+ }
148+
149+ get vignetteEnabled ( ) {
150+ return this . _vignetteEnabled ;
151+ }
152+
103153 set toneMapping ( value ) {
104154 if ( this . _toneMapping !== value ) {
105155 this . _toneMapping = value ;
@@ -136,14 +186,16 @@ class RenderPassCompose extends RenderPassShaderQuad {
136186
137187 const key = `${ this . toneMapping } ` +
138188 `-${ this . bloomTexture ? 'bloom' : 'nobloom' } ` +
139- `-${ this . gradingEnabled ? 'grading' : 'nograding' } ` ;
189+ `-${ this . gradingEnabled ? 'grading' : 'nograding' } ` +
190+ `-${ this . vignetteEnabled ? 'vignette' : 'novignette' } ` ;
140191
141192 if ( this . _key !== key ) {
142193 this . _key = key ;
143194
144195 const defines =
145196 ( this . bloomTexture ? `#define BLOOM\n` : '' ) +
146- ( this . gradingEnabled ? `#define GRADING\n` : '' ) ;
197+ ( this . gradingEnabled ? `#define GRADING\n` : '' ) +
198+ ( this . vignetteEnabled ? `#define VIGNETTE\n` : '' ) ;
147199
148200 const fsChunks =
149201 shaderChunks . decodePS +
@@ -168,6 +220,10 @@ class RenderPassCompose extends RenderPassShaderQuad {
168220 this . bcsId . setValue ( [ this . gradingBrightness , this . gradingContrast , this . gradingSaturation ] ) ;
169221 }
170222
223+ if ( this . _vignetteEnabled ) {
224+ this . vignetterParamsId . setValue ( [ this . vignetteInner , this . vignetteOuter , this . vignetteCurvature , this . vignetteIntensity ] ) ;
225+ }
226+
171227 super . execute ( ) ;
172228 }
173229}
0 commit comments