@@ -164,32 +164,44 @@ -(void)buildFragmentFunctions
164
164
165
165
// Header
166
166
[shaderString appendFormat: @" \
167
- lowp vec4 src = vec4(0.0);\
168
- lowp vec4 dst = vec4(0.0);\n " ];
167
+ lowp vec4 src = vec4(0.0);\n \
168
+ lowp vec4 dst = vec4(0.0);\n \
169
+ vec2 compare;\n \
170
+ float inBounds;\n \
171
+ vec2 blurCoords;\
172
+ " ];
169
173
170
174
[shaderString appendString: @" if(u_enableGlowMap == 0.0) {\n " ];
171
175
172
176
[shaderString appendString: @" const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n " ];
173
177
[shaderString appendString: @" vec4 srcPixel; float luminanceCheck;\n " ];
174
178
175
179
// Inner texture loop
180
+ [shaderString appendString: @" compare = cc_FragTexCoord1Extents - abs(v_blurCoordinates[0] - cc_FragTexCoord1Center);" ];
181
+ [shaderString appendString: @" inBounds = step(0.0, min(compare.x, compare.y));" ];
176
182
[shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0]);\n " ];
177
183
[shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
178
- [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , standardGaussianWeights[0 ]];
184
+ [shaderString appendFormat: @" src += inBounds * luminanceCheck * srcPixel * %f ;\n " , standardGaussianWeights[0 ]];
179
185
180
186
for (NSUInteger currentBlurCoordinateIndex = 0 ; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++)
181
187
{
182
188
GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1 ];
183
189
GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2 ];
184
190
GLfloat optimizedWeight = firstWeight + secondWeight;
185
191
186
- [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]);\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 1 )];
192
+ [shaderString appendFormat: @" blurCoords = v_blurCoordinates[%lu ];" , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 1 )];
193
+ [shaderString appendString: @" compare = cc_FragTexCoord1Extents - abs(blurCoords - cc_FragTexCoord1Center);" ];
194
+ [shaderString appendString: @" inBounds = step(0.0, min(compare.x, compare.y));" ];
195
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, blurCoords);\n " ];
187
196
[shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
188
- [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
197
+ [shaderString appendFormat: @" src += inBounds * luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
189
198
190
- [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[%lu ]);\n " , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 2 )];
199
+ [shaderString appendFormat: @" blurCoords = v_blurCoordinates[%lu ];" , (unsigned long )((currentBlurCoordinateIndex * 2 ) + 2 )];
200
+ [shaderString appendString: @" compare = cc_FragTexCoord1Extents - abs(blurCoords - cc_FragTexCoord1Center);" ];
201
+ [shaderString appendString: @" inBounds = step(0.0, min(compare.x, compare.y));" ];
202
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, blurCoords);\n " ];
191
203
[shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
192
- [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
204
+ [shaderString appendFormat: @" src += inBounds * luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
193
205
}
194
206
195
207
// 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
@@ -205,19 +217,27 @@ -(void)buildFragmentFunctions
205
217
GLfloat optimizedWeight = firstWeight + secondWeight;
206
218
GLfloat optimizedOffset = (firstWeight * (currentOverlowTextureRead * 2 + 1 ) + secondWeight * (currentOverlowTextureRead * 2 + 2 )) / optimizedWeight;
207
219
208
- [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] + singleStepOffset * %f );\n " , optimizedOffset];
220
+ [shaderString appendFormat: @" blurCoords = v_blurCoordinates[0] + singleStepOffset * %f );\n " , optimizedOffset];
221
+ [shaderString appendString: @" compare = cc_FragTexCoord1Extents - abs(blurCoords - cc_FragTexCoord1Center);" ];
222
+ [shaderString appendString: @" inBounds = step(0.0, min(compare.x, compare.y));" ];
223
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, blurCoords);\n " ];
209
224
[shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
210
- [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
225
+ [shaderString appendFormat: @" src += inBounds * luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
211
226
212
- [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0] - singleStepOffset * %f );\n " , optimizedOffset];
227
+ [shaderString appendFormat: @" blurCoords = v_blurCoordinates[0] - singleStepOffset * %f );\n " , optimizedOffset];
228
+ [shaderString appendString: @" compare = cc_FragTexCoord1Extents - abs(blurCoords - cc_FragTexCoord1Center);" ];
229
+ [shaderString appendString: @" inBounds = step(0.0, min(compare.x, compare.y));" ];
230
+ [shaderString appendFormat: @" srcPixel = texture2D(cc_PreviousPassTexture, blurCoords);\n " ];
213
231
[shaderString appendString: @" luminanceCheck = step(u_luminanceThreshold, dot(srcPixel.rgb, luminanceWeighting));\n " ];
214
- [shaderString appendFormat: @" src += luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
232
+ [shaderString appendFormat: @" src += inBounds * luminanceCheck * srcPixel * %f ;\n " , optimizedWeight];
215
233
}
216
234
}
217
235
218
236
[shaderString appendString: @" } else {\n " ];
219
237
[shaderString appendString: @" \
220
- dst = texture2D(cc_MainTexture, cc_FragTexCoord1);\
238
+ compare = cc_FragTexCoord2Extents - abs(cc_FragTexCoord2 - cc_FragTexCoord2Center); \
239
+ inBounds = step(0.0, min(compare.x, compare.y)); \
240
+ dst = texture2D(cc_MainTexture, cc_FragTexCoord2) * inBounds;\
221
241
src = texture2D(cc_PreviousPassTexture, cc_FragTexCoord1);\
222
242
}\n " ];
223
243
@@ -315,13 +335,16 @@ -(void)buildRenderPasses
315
335
316
336
__weak CCEffectBloom *weakSelf = self;
317
337
318
- CCEffectRenderPass *pass0 = [[CCEffectRenderPass alloc ] init ];
338
+ CCEffectRenderPass *pass0 = [[CCEffectRenderPass alloc ] initWithIndex: 0 ];
319
339
pass0.debugLabel = @" CCEffectBloom pass 0" ;
320
340
pass0.shader = self.shader ;
321
341
pass0.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
322
342
323
343
pass.shaderUniforms [CCShaderUniformMainTexture] = previousPassTexture;
324
344
pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
345
+ pass.shaderUniforms [CCShaderUniformTexCoord1Center] = [NSValue valueWithGLKVector2: pass.texCoord1Center];
346
+ pass.shaderUniforms [CCShaderUniformTexCoord1Extents] = [NSValue valueWithGLKVector2: pass.texCoord1Extents];
347
+
325
348
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_enableGlowMap" ]] = [NSNumber numberWithFloat: 0 .0f ];
326
349
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: _luminanceThreshold];
327
350
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
@@ -332,12 +355,15 @@ -(void)buildRenderPasses
332
355
} copy]];
333
356
334
357
335
- CCEffectRenderPass *pass1 = [[CCEffectRenderPass alloc ] init ];
358
+ CCEffectRenderPass *pass1 = [[CCEffectRenderPass alloc ] initWithIndex: 1 ];
336
359
pass1.debugLabel = @" CCEffectBloom pass 1" ;
337
360
pass1.shader = self.shader ;
338
361
pass1.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
339
362
340
363
pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
364
+ pass.shaderUniforms [CCShaderUniformTexCoord1Center] = [NSValue valueWithGLKVector2: GLKVector2Make (0 .5f , 0 .5f )];
365
+ pass.shaderUniforms [CCShaderUniformTexCoord1Extents] = [NSValue valueWithGLKVector2: GLKVector2Make (1 .0f , 1 .0f )];
366
+
341
367
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_enableGlowMap" ]] = [NSNumber numberWithFloat: 0 .0f ];
342
368
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: 0 .0f ];
343
369
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
@@ -348,12 +374,19 @@ -(void)buildRenderPasses
348
374
} copy]];
349
375
350
376
351
- CCEffectRenderPass *pass2 = [[CCEffectRenderPass alloc ] init ];
377
+ CCEffectRenderPass *pass2 = [[CCEffectRenderPass alloc ] initWithIndex: 2 ];
352
378
pass2.debugLabel = @" CCEffectBloom pass 2" ;
353
379
pass2.shader = self.shader ;
380
+ pass2.texCoord1Mapping = CCEffectTexCoordMapPreviousPassTex;
381
+ pass2.texCoord2Mapping = CCEffectTexCoordMapMainTex;
354
382
pass2.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
355
383
356
384
pass.shaderUniforms [CCShaderUniformPreviousPassTexture] = previousPassTexture;
385
+ pass.shaderUniforms [CCShaderUniformTexCoord1Center] = [NSValue valueWithGLKVector2: GLKVector2Make (0 .5f , 0 .5f )];
386
+ pass.shaderUniforms [CCShaderUniformTexCoord1Extents] = [NSValue valueWithGLKVector2: GLKVector2Make (1 .0f , 1 .0f )];
387
+ pass.shaderUniforms [CCShaderUniformTexCoord2Center] = [NSValue valueWithGLKVector2: pass.texCoord1Center];
388
+ pass.shaderUniforms [CCShaderUniformTexCoord2Extents] = [NSValue valueWithGLKVector2: pass.texCoord1Extents];
389
+
357
390
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_enableGlowMap" ]] = [NSNumber numberWithFloat: 1 .0f ];
358
391
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_luminanceThreshold" ]] = [NSNumber numberWithFloat: 0 .0f ];
359
392
pass.shaderUniforms [weakSelf.uniformTranslationTable[@" u_intensity" ]] = [NSNumber numberWithFloat: _transformedIntensity];
0 commit comments