@@ -105,7 +105,7 @@ -(void)setLuminanceThreshold:(float)luminanceThreshold
105105-(void )setIntensity : (float )intensity
106106{
107107 _intensity = clampf (intensity, 0 .0f , 1 .0f );
108- _transformedIntensity = 1 . 0f - _intensity;
108+ _transformedIntensity = _intensity;
109109}
110110
111111-(void )setBlurRadius : (NSUInteger )blurRadius
@@ -169,17 +169,27 @@ -(void)buildFragmentFunctions
169169
170170 [shaderString appendString: @" if(u_enableGlowMap == 0.0) {\n " ];
171171
172+ [shaderString appendString: @" const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n " ];
173+ [shaderString appendString: @" vec4 srcPixel; float luminanceCheck;\n " ];
174+
172175 // 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 ]];
174179
175180 for (NSUInteger currentBlurCoordinateIndex = 0 ; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++)
176181 {
177182 GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1 ];
178183 GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2 ];
179184 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];
183193 }
184194
185195 // 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
194204
195205 GLfloat optimizedWeight = firstWeight + secondWeight;
196206 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];
200215 }
201216 }
202217
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-
207218 [shaderString appendString: @" } else {\n " ];
208219 [shaderString appendString: @" \
209220 dst = texture2D(cc_MainTexture, cc_FragTexCoord1);\
@@ -214,7 +225,7 @@ -(void)buildFragmentFunctions
214225 // Choose one?
215226 // TODO: try using min(src, dst) to create a gloomEffect
216227 // NSString* additiveBlending = @"src + dst";
217- NSString * screenBlending = @" (src + dst) - ((src * dst) * u_intensity)" ;
228+ NSString * screenBlending = @" (src * u_intensity + dst) - ((src * dst) * u_intensity)" ;
218229
219230 [shaderString appendFormat: @" \
220231 return %@ ;\n " , screenBlending];
@@ -328,7 +339,7 @@ -(void)buildRenderPasses
328339
329340 pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
330341 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 ];
332343 pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
333344
334345 GLKVector2 dur = GLKVector2Make (0.0 , 1.0 / (previousPassTexture.pixelHeight / previousPassTexture.contentScale ));
@@ -344,7 +355,7 @@ -(void)buildRenderPasses
344355
345356 pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
346357 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 ];
348359 pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
349360
350361 } copy]];
0 commit comments