@@ -105,7 +105,7 @@ -(void)setLuminanceThreshold:(float)luminanceThreshold
105
105
-(void )setIntensity : (float )intensity
106
106
{
107
107
_intensity = clampf (intensity, 0 .0f , 1 .0f );
108
- _transformedIntensity = 1 . 0f - _intensity;
108
+ _transformedIntensity = _intensity;
109
109
}
110
110
111
111
-(void )setBlurRadius : (NSUInteger )blurRadius
@@ -169,17 +169,27 @@ -(void)buildFragmentFunctions
169
169
170
170
[shaderString appendString: @" if(u_enableGlowMap == 0.0) {\n " ];
171
171
172
+ [shaderString appendString: @" const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n " ];
173
+ [shaderString appendString: @" vec4 srcPixel; float luminanceCheck;\n " ];
174
+
172
175
// Inner texture loop
173
- [shaderString appendFormat: @" src += texture2D(cc_PreviousPassTexture, v_blurCoordinates[0]) * %f ;\n " , standardGaussianWeights[0 ]];
176
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0]);\n " ];
177
+ [shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
178
+ [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , standardGaussianWeights[0 ]];
174
179
175
180
for (NSUInteger currentBlurCoordinateIndex = 0 ; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++)
176
181
{
177
182
GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1 ];
178
183
GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2 ];
179
184
GLfloat optimizedWeight = firstWeight + secondWeight;
180
-
181
- [shaderString appendFormat: @" src += texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]) * %f ;\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 1 ), optimizedWeight];
182
- [shaderString appendFormat: @" src += texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]) * %f ;\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 2 ), optimizedWeight];
185
+
186
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]);\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 1 )];
187
+ [shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
188
+ [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
189
+
190
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]);\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 2 )];
191
+ [shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
192
+ [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
183
193
}
184
194
185
195
// If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader
@@ -194,16 +204,17 @@ -(void)buildFragmentFunctions
194
204
195
205
GLfloat optimizedWeight = firstWeight + secondWeight;
196
206
GLfloat optimizedOffset = (firstWeight * (currentOverlowTextureRead * 2 + 1 ) + secondWeight * (currentOverlowTextureRead * 2 + 2 )) / optimizedWeight;
197
-
198
- [shaderString appendFormat: @" src += texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] + singleStepOffset * %f ) * %f ;\n " , optimizedOffset, optimizedWeight];
199
- [shaderString appendFormat: @" src += texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] - singleStepOffset * %f ) * %f ;\n " , optimizedOffset, optimizedWeight];
207
+
208
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] + singleStepOffset * %f );\n " , optimizedOffset];
209
+ [shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
210
+ [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
211
+
212
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] - singleStepOffset * %f );\n " , optimizedOffset];
213
+ [shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
214
+ [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
200
215
}
201
216
}
202
217
203
- [shaderString appendString: @" const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n \
204
- float luminance = dot(src.rgb, luminanceWeighting);\n \
205
- if(luminance < u_luminanceThreshold)\n discard;\n " ];
206
-
207
218
[shaderString appendString: @" } else {\n " ];
208
219
[shaderString appendString: @" \
209
220
dst = texture2D(cc_MainTexture, cc_FragTexCoord1);\
@@ -214,7 +225,7 @@ -(void)buildFragmentFunctions
214
225
// Choose one?
215
226
// TODO: try using min(src, dst) to create a gloomEffect
216
227
// NSString* additiveBlending = @"src + dst";
217
- NSString * screenBlending = @" (src + dst) - ((src * dst) * u_intensity)" ;
228
+ NSString * screenBlending = @" (src * u_intensity + dst) - ((src * dst) * u_intensity)" ;
218
229
219
230
[shaderString appendFormat: @" \
220
231
return %@ ;\n " , screenBlending];
@@ -328,7 +339,7 @@ -(void)buildRenderPasses
328
339
329
340
pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
330
341
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_enableGlowMap" ]] = [NSNumber numberWithFloat: 0 .0f ];
331
- pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: _luminanceThreshold ];
342
+ pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: 0 . 0f ];
332
343
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
333
344
334
345
GLKVector2 dur = GLKVector2Make (0.0 , 1.0 / (previousPassTexture.pixelHeight / previousPassTexture.contentScale ));
@@ -344,7 +355,7 @@ -(void)buildRenderPasses
344
355
345
356
pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
346
357
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_enableGlowMap" ]] = [NSNumber numberWithFloat: 1 .0f ];
347
- pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: _luminanceThreshold ];
358
+ pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: 0 . 0f ];
348
359
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
349
360
350
361
} copy]];
0 commit comments