@@ -18,7 +18,7 @@ const fragmentShader = `
18
18
uniform vec3 brightnessContrastSaturation;
19
19
20
20
// 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)
22
22
{
23
23
color = color * brt;
24
24
float grey = dot(color, vec3(0.3, 0.59, 0.11));
@@ -28,6 +28,29 @@ const fragmentShader = `
28
28
29
29
#endif
30
30
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
+
31
54
void main() {
32
55
vec4 scene = texture2D(sceneTexture, uv0);
33
56
vec3 result = scene.rgb;
@@ -38,10 +61,15 @@ const fragmentShader = `
38
61
#endif
39
62
40
63
#ifdef GRADING
41
- result = ContrastSaturationBrightness (result, brightnessContrastSaturation.x, brightnessContrastSaturation.z, brightnessContrastSaturation.y);
64
+ result = contrastSaturationBrightness (result, brightnessContrastSaturation.x, brightnessContrastSaturation.z, brightnessContrastSaturation.y);
42
65
#endif
43
66
44
67
result = toneMap(result);
68
+
69
+ #ifdef VIGNETTE
70
+ result *= vignette(uv0);
71
+ #endif
72
+
45
73
result = gammaCorrectOutput(result);
46
74
47
75
gl_FragColor = vec4(result, scene.a);
@@ -67,6 +95,16 @@ class RenderPassCompose extends RenderPassShaderQuad {
67
95
68
96
_shaderDirty = true ;
69
97
98
+ _vignetteEnabled = false ;
99
+
100
+ vignetteInner = 0.5 ;
101
+
102
+ vignetteOuter = 1.0 ;
103
+
104
+ vignetteCurvature = 0.5 ;
105
+
106
+ vignetteIntensity = 0.3 ;
107
+
70
108
_key = '' ;
71
109
72
110
constructor ( graphicsDevice ) {
@@ -76,6 +114,7 @@ class RenderPassCompose extends RenderPassShaderQuad {
76
114
this . bloomTextureId = graphicsDevice . scope . resolve ( 'bloomTexture' ) ;
77
115
this . bloomIntensityId = graphicsDevice . scope . resolve ( 'bloomIntensity' ) ;
78
116
this . bcsId = graphicsDevice . scope . resolve ( 'brightnessContrastSaturation' ) ;
117
+ this . vignetterParamsId = graphicsDevice . scope . resolve ( 'vignetterParams' ) ;
79
118
}
80
119
81
120
set bloomTexture ( value ) {
@@ -100,6 +139,17 @@ class RenderPassCompose extends RenderPassShaderQuad {
100
139
return this . _gradingEnabled ;
101
140
}
102
141
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
+
103
153
set toneMapping ( value ) {
104
154
if ( this . _toneMapping !== value ) {
105
155
this . _toneMapping = value ;
@@ -136,14 +186,16 @@ class RenderPassCompose extends RenderPassShaderQuad {
136
186
137
187
const key = `${ this . toneMapping } ` +
138
188
`-${ this . bloomTexture ? 'bloom' : 'nobloom' } ` +
139
- `-${ this . gradingEnabled ? 'grading' : 'nograding' } ` ;
189
+ `-${ this . gradingEnabled ? 'grading' : 'nograding' } ` +
190
+ `-${ this . vignetteEnabled ? 'vignette' : 'novignette' } ` ;
140
191
141
192
if ( this . _key !== key ) {
142
193
this . _key = key ;
143
194
144
195
const defines =
145
196
( this . bloomTexture ? `#define BLOOM\n` : '' ) +
146
- ( this . gradingEnabled ? `#define GRADING\n` : '' ) ;
197
+ ( this . gradingEnabled ? `#define GRADING\n` : '' ) +
198
+ ( this . vignetteEnabled ? `#define VIGNETTE\n` : '' ) ;
147
199
148
200
const fsChunks =
149
201
shaderChunks . decodePS +
@@ -168,6 +220,10 @@ class RenderPassCompose extends RenderPassShaderQuad {
168
220
this . bcsId . setValue ( [ this . gradingBrightness , this . gradingContrast , this . gradingSaturation ] ) ;
169
221
}
170
222
223
+ if ( this . _vignetteEnabled ) {
224
+ this . vignetterParamsId . setValue ( [ this . vignetteInner , this . vignetteOuter , this . vignetteCurvature , this . vignetteIntensity ] ) ;
225
+ }
226
+
171
227
super . execute ( ) ;
172
228
}
173
229
}
0 commit comments