Skip to content

Commit abdb92c

Browse files
author
Thayer J Andrews
committed
CCEffectBloom - Add support for padding to the bloom effect
1 parent 7eee454 commit abdb92c

File tree

1 file changed

+48
-15
lines changed

1 file changed

+48
-15
lines changed

cocos2d/CCEffectBloom.m

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -164,32 +164,44 @@ -(void)buildFragmentFunctions
164164

165165
// Header
166166
[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+
"];
169173

170174
[shaderString appendString:@"if(u_enableGlowMap == 0.0) {\n"];
171175

172176
[shaderString appendString:@"const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n"];
173177
[shaderString appendString:@"vec4 srcPixel; float luminanceCheck;\n"];
174178

175179
// 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));"];
176182
[shaderString appendFormat:@"srcPixel = texture2D(cc_PreviousPassTexture, v_blurCoordinates[0]);\n"];
177183
[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]];
179185

180186
for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++)
181187
{
182188
GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1];
183189
GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2];
184190
GLfloat optimizedWeight = firstWeight + secondWeight;
185191

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"];
187196
[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];
189198

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"];
191203
[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];
193205
}
194206

195207
// 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
205217
GLfloat optimizedWeight = firstWeight + secondWeight;
206218
GLfloat optimizedOffset = (firstWeight * (currentOverlowTextureRead * 2 + 1) + secondWeight * (currentOverlowTextureRead * 2 + 2)) / optimizedWeight;
207219

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"];
209224
[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];
211226

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"];
213231
[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];
215233
}
216234
}
217235

218236
[shaderString appendString:@"} else {\n"];
219237
[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;\
221241
src = texture2D(cc_PreviousPassTexture, cc_FragTexCoord1);\
222242
}\n"];
223243

@@ -315,13 +335,16 @@ -(void)buildRenderPasses
315335

316336
__weak CCEffectBloom *weakSelf = self;
317337

318-
CCEffectRenderPass *pass0 = [[CCEffectRenderPass alloc] init];
338+
CCEffectRenderPass *pass0 = [[CCEffectRenderPass alloc] initWithIndex:0];
319339
pass0.debugLabel = @"CCEffectBloom pass 0";
320340
pass0.shader = self.shader;
321341
pass0.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
322342

323343
pass.shaderUniforms[CCShaderUniformMainTexture] = previousPassTexture;
324344
pass.shaderUniforms[CCShaderUniformPreviousPassTexture] = previousPassTexture;
345+
pass.shaderUniforms[CCShaderUniformTexCoord1Center] = [NSValue valueWithGLKVector2:pass.texCoord1Center];
346+
pass.shaderUniforms[CCShaderUniformTexCoord1Extents] = [NSValue valueWithGLKVector2:pass.texCoord1Extents];
347+
325348
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:0.0f];
326349
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:_luminanceThreshold];
327350
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];
@@ -332,12 +355,15 @@ -(void)buildRenderPasses
332355
} copy]];
333356

334357

335-
CCEffectRenderPass *pass1 = [[CCEffectRenderPass alloc] init];
358+
CCEffectRenderPass *pass1 = [[CCEffectRenderPass alloc] initWithIndex:1];
336359
pass1.debugLabel = @"CCEffectBloom pass 1";
337360
pass1.shader = self.shader;
338361
pass1.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
339362

340363
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+
341367
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:0.0f];
342368
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:0.0f];
343369
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];
@@ -348,12 +374,19 @@ -(void)buildRenderPasses
348374
} copy]];
349375

350376

351-
CCEffectRenderPass *pass2 = [[CCEffectRenderPass alloc] init];
377+
CCEffectRenderPass *pass2 = [[CCEffectRenderPass alloc] initWithIndex:2];
352378
pass2.debugLabel = @"CCEffectBloom pass 2";
353379
pass2.shader = self.shader;
380+
pass2.texCoord1Mapping = CCEffectTexCoordMapPreviousPassTex;
381+
pass2.texCoord2Mapping = CCEffectTexCoordMapMainTex;
354382
pass2.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
355383

356384
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+
357390
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:1.0f];
358391
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:0.0f];
359392
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];

0 commit comments

Comments
 (0)