@@ -60,6 +60,7 @@ RenderTexture::RenderTexture()
60
60
, _autoDraw(false )
61
61
, _sprite(nullptr )
62
62
, _saveFileCallback(nullptr )
63
+ , _depthAndStencilFormat(0 )
63
64
{
64
65
#if CC_ENABLE_CACHE_TEXTURE_DATA
65
66
// Listen this event to save render texture before come to background.
@@ -118,6 +119,18 @@ void RenderTexture::listenToBackground(EventCustom* /*event*/)
118
119
119
120
glDeleteFramebuffers (1 , &_FBO);
120
121
_FBO = 0 ;
122
+
123
+ if (_depthRenderBuffer)
124
+ {
125
+ glDeleteRenderbuffers (1 , &_depthRenderBuffer);
126
+ _depthRenderBuffer = 0 ;
127
+ }
128
+
129
+ if (_stencilRenderBuffer)
130
+ {
131
+ glDeleteRenderbuffers (1 , &_stencilRenderBuffer);
132
+ _stencilRenderBuffer = 0 ;
133
+ }
121
134
#endif
122
135
}
123
136
@@ -126,9 +139,18 @@ void RenderTexture::listenToForeground(EventCustom* /*event*/)
126
139
#if CC_ENABLE_CACHE_TEXTURE_DATA
127
140
// -- regenerate frame buffer object and attach the texture
128
141
glGetIntegerv (GL_FRAMEBUFFER_BINDING, &_oldFBO);
142
+
143
+ GLint oldRBO;
144
+ glGetIntegerv (GL_RENDERBUFFER_BINDING, &oldRBO);
129
145
130
146
glGenFramebuffers (1 , &_FBO);
131
147
glBindFramebuffer (GL_FRAMEBUFFER, _FBO);
148
+
149
+ const Size& s = _texture->getContentSizeInPixels ();
150
+ if (_depthAndStencilFormat != 0 )
151
+ {
152
+ setupDepthAndStencil (s.width , s.height );
153
+ }
132
154
133
155
_texture->setAntiAliasTexParameters ();
134
156
if (_textureCopy)
@@ -137,6 +159,7 @@ void RenderTexture::listenToForeground(EventCustom* /*event*/)
137
159
}
138
160
139
161
glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture->getName (), 0 );
162
+ glBindRenderbuffer (GL_RENDERBUFFER, oldRBO);
140
163
glBindFramebuffer (GL_FRAMEBUFFER, _oldFBO);
141
164
#endif
142
165
}
@@ -258,69 +281,15 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, Texture2D::PixelFormat
258
281
259
282
if (depthStencilFormat != 0 )
260
283
{
261
-
262
-
263
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
264
- if (Configuration::getInstance ()->supportsOESPackedDepthStencil ())
265
- {
266
- // create and attach depth buffer
267
- glGenRenderbuffers (1 , &_depthRenderBuffer);
268
- glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
269
- glRenderbufferStorage (GL_RENDERBUFFER, depthStencilFormat, (GLsizei)powW, (GLsizei)powH);
270
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
271
-
272
- // if depth format is the one with stencil part, bind same render buffer as stencil attachment
273
- if (depthStencilFormat == GL_DEPTH24_STENCIL8)
274
- {
275
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
276
- }
277
- }
278
- else
279
- {
280
-
281
- glGenRenderbuffers (1 , &_depthRenderBuffer);
282
- glGenRenderbuffers (1 , &_stencilRenderBuffer);
283
- glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
284
-
285
- if (Configuration::getInstance ()->supportsOESDepth24 ())
286
- {
287
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, (GLsizei)powW, (GLsizei)powH);
288
- }
289
- else
290
- {
291
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, (GLsizei)powW, (GLsizei)powH);
292
- }
293
-
294
- glBindRenderbuffer (GL_RENDERBUFFER, _stencilRenderBuffer);
295
- glRenderbufferStorage (GL_RENDERBUFFER, GL_STENCIL_INDEX8, (GLsizei)powW, (GLsizei)powH);
296
-
297
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
298
- glFramebufferRenderbuffer (GL_FRAMEBUFFER,
299
- GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _stencilRenderBuffer);
300
- }
301
- #else
302
-
303
- // create and attach depth buffer
304
- glGenRenderbuffers (1 , &_depthRenderBuffer);
305
- glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
306
- glRenderbufferStorage (GL_RENDERBUFFER, depthStencilFormat, (GLsizei)powW, (GLsizei)powH);
307
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
308
-
309
- // if depth format is the one with stencil part, bind same render buffer as stencil attachment
310
- if (depthStencilFormat == GL_DEPTH24_STENCIL8)
311
- {
312
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
313
- }
314
-
315
- #endif
316
-
284
+ _depthAndStencilFormat = depthStencilFormat;
285
+ setupDepthAndStencil (powW, powH);
317
286
}
318
287
319
288
// check if it worked (probably worth doing :) )
320
289
CCASSERT (glCheckFramebufferStatus (GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE, " Could not attach texture to framebuffer" );
321
290
322
291
_texture->setAntiAliasTexParameters ();
323
- if (_textureCopy)
292
+ if (_textureCopy)
324
293
{
325
294
_textureCopy->setAntiAliasTexParameters ();
326
295
}
@@ -351,6 +320,61 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, Texture2D::PixelFormat
351
320
return ret;
352
321
}
353
322
323
+ void RenderTexture::setupDepthAndStencil (int powW, int powH)
324
+ {
325
+
326
+ #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
327
+ if (Configuration::getInstance ()->supportsOESPackedDepthStencil ())
328
+ {
329
+ // create and attach depth buffer
330
+ glGenRenderbuffers (1 , &_depthRenderBuffer);
331
+ glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
332
+ glRenderbufferStorage (GL_RENDERBUFFER, _depthAndStencilFormat, (GLsizei)powW, (GLsizei)powH);
333
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
334
+
335
+ // if depth format is the one with stencil part, bind same render buffer as stencil attachment
336
+ if (_depthAndStencilFormat == GL_DEPTH24_STENCIL8)
337
+ {
338
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
339
+ }
340
+ }
341
+ else
342
+ {
343
+ glGenRenderbuffers (1 , &_depthRenderBuffer);
344
+ glGenRenderbuffers (1 , &_stencilRenderBuffer);
345
+ glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
346
+
347
+ if (Configuration::getInstance ()->supportsOESDepth24 ())
348
+ {
349
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, (GLsizei)powW, (GLsizei)powH);
350
+ }
351
+ else
352
+ {
353
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, (GLsizei)powW, (GLsizei)powH);
354
+ }
355
+
356
+ glBindRenderbuffer (GL_RENDERBUFFER, _stencilRenderBuffer);
357
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_STENCIL_INDEX8, (GLsizei)powW, (GLsizei)powH);
358
+
359
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
360
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER,
361
+ GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _stencilRenderBuffer);
362
+ }
363
+ #else
364
+ // create and attach depth buffer
365
+ glGenRenderbuffers (1 , &_depthRenderBuffer);
366
+ glBindRenderbuffer (GL_RENDERBUFFER, _depthRenderBuffer);
367
+ glRenderbufferStorage (GL_RENDERBUFFER, _depthAndStencilFormat, (GLsizei)powW, (GLsizei)powH);
368
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
369
+
370
+ // if depth format is the one with stencil part, bind same render buffer as stencil attachment
371
+ if (_depthAndStencilFormat == GL_DEPTH24_STENCIL8)
372
+ {
373
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
374
+ }
375
+ #endif
376
+ }
377
+
354
378
void RenderTexture::setSprite (Sprite* sprite)
355
379
{
356
380
#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
0 commit comments