void CreateSurfaceMultisampleBuffersGLES(EAGLSurfaceDesc* surface) { UNITY_DBG_LOG ("CreateSurfaceMultisampleBuffers: samples=%i\n", surface->msaaSamples); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); gDefaultFBO = surface->framebuffer; DestroySurfaceMultisampleBuffersGLES(surface); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); #if GL_APPLE_framebuffer_multisample if(surface->msaaSamples > 1) { GLES_CHK( glGenRenderbuffersOES(1, &surface->msaaRenderbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); GLES_CHK( glGenFramebuffersOES(1, &surface->msaaFramebuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->msaaFramebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->msaaFramebuffer) ); gDefaultFBO = surface->msaaFramebuffer; GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, surface->format, surface->w, surface->h) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); if(surface->depthFormat) { GLES_CHK( glGenRenderbuffersOES(1, &surface->msaaDepthbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->msaaDepthbuffer) ); GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, GL_DEPTH_COMPONENT16_OES, surface->w, surface->h) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->msaaDepthbuffer) ); } } else #endif { if(surface->depthFormat) { GLES_CHK( glGenRenderbuffersOES(1, &surface->depthbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->depthbuffer) ); GLES_CHK( glRenderbufferStorageOES(GL_RENDERBUFFER_OES, surface->depthFormat, surface->w, surface->h) ); UNITY_DBG_LOG ("glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, %d) :: AppCtrl\n", surface->depthbuffer); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->depthbuffer) ); } } }
void ofFbo::updateTexture(int attachmentPoint) { // TODO: flag to see if this is dirty or not if(fbo != fboTextures) { glGetIntegerv( GL_FRAMEBUFFER_BINDING, &savedFramebuffer ); // save current drawbuffer glPushAttrib(GL_COLOR_BUFFER_BIT); // save current readbuffer GLint readBuffer; glGetIntegerv(GL_READ_BUFFER, &readBuffer); glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboTextures); glDrawBuffer(GL_COLOR_ATTACHMENT0 + attachmentPoint); glReadBuffer(GL_COLOR_ATTACHMENT0 + attachmentPoint); #ifndef TARGET_OPENGLES glBlitFramebuffer(0, 0, settings.width, settings.height, 0, 0, settings.width, settings.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); #else glRenderbufferStorageMultisampleAPPLE(); // untested #endif glBindFramebuffer(GL_READ_FRAMEBUFFER, savedFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, savedFramebuffer); glBindFramebuffer( GL_FRAMEBUFFER, savedFramebuffer ); // restore readbuffer glReadBuffer(readBuffer); // restore drawbuffer glPopAttrib(); } }
void RenderingEngine2::bind_msaa_framebuffer(const GLuint fbo, const GLuint crbo, const GLuint drbo) { /* bind multisample framebuffer */ glBindFramebuffer(GL_FRAMEBUFFER, fbo); /* bind multisample color renderbuffer */ glBindRenderbuffer(GL_RENDERBUFFER, crbo); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, bufferWidth_, bufferHeight_); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, crbo); /* bind multisample depth buffer */ glBindRenderbuffer(GL_RENDERBUFFER, drbo); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, bufferWidth_, bufferHeight_); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, drbo); assert (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); }
inline void VL_glRenderbufferStorageMultisample( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height ) { #ifdef GL_APPLE_framebuffer_multisample if (glRenderbufferStorageMultisampleAPPLE) glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); else #endif #ifdef GL_IMG_multisampled_render_to_texture if (glRenderbufferStorageMultisampleIMG) glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); else #endif #ifdef GL_ANGLE_framebuffer_multisample if (glRenderbufferStorageMultisampleANGLE) glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); else #endif VL_TRAP(); }
void ofFbo::updateTexture(int attachmentPoint) { // TODO: flag to see if this is dirty or not if(fbo != fboTextures) { glGetIntegerv( GL_FRAMEBUFFER_BINDING, &savedFramebuffer ); // save current drawbuffer glPushAttrib(GL_COLOR_BUFFER_BIT); // save current readbuffer GLint readBuffer; glGetIntegerv(GL_READ_BUFFER, &readBuffer); glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboTextures); glDrawBuffer(GL_COLOR_ATTACHMENT0 + attachmentPoint); glReadBuffer(GL_COLOR_ATTACHMENT0 + attachmentPoint); #ifndef TARGET_OPENGLES glBlitFramebuffer(0, 0, settings.width, settings.height, 0, 0, settings.width, settings.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); #else glRenderbufferStorageMultisampleAPPLE(); // untested #endif glBindFramebuffer(GL_READ_FRAMEBUFFER, savedFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, savedFramebuffer); glBindFramebuffer( GL_FRAMEBUFFER, savedFramebuffer ); // restore readbuffer glReadBuffer(readBuffer); // restore drawbuffer glPopAttrib(); } // HAD TO COMMENT IT OUT BECAUSE THE MACHINE WAS CRASHING /*if(settings.useMipmapping){ glBindTexture(settings.textureTarget, colorBuffers[attachmentPoint]); glGenerateMipmap(settings.textureTarget); }*/ }
void ColorRenderbufferMultisampleRGBA8::CreateStorage(int width, int height) const { glRenderbufferStorageMultisampleAPPLE(FRAMEBUFFER_OBJECT_RENDERBUFFER, 4, GL_RGBA8_OES, width, height); CheckError(); }
void RenderScene::SetupStuff() { GLCALL(glEnable, GL_DEPTH_TEST); #ifdef PLATFORM_IOS GLCALL(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &g_default_fbo); #endif // Create a frame buffer object: GLCALL(glGenFramebuffers, 1, &g_depth_fbo_id); GLCALL(glBindFramebuffer, GL_FRAMEBUFFER, g_depth_fbo_id); // Create a render buffer GLCALL(glGenRenderbuffers, 1, &renderBuffer); GLCALL(glBindRenderbuffer, GL_RENDERBUFFER, renderBuffer); unsigned int depthMap_width, depthMap_height; ENGINE->GetShadowMap()->GetDepthMapResolution(depthMap_width, depthMap_height); // Create a depth texture: GLCALL(glGenTextures, 1, &ENGINE->GetShadowMap()->depthTexture); GLCALL(glActiveTexture, GL_TEXTURE2); GLCALL(glBindTexture, GL_TEXTURE_2D, ENGINE->GetShadowMap()->depthTexture); GLCALL(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGBA, depthMap_width, depthMap_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // GLCALL(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); GLCALL(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); GLCALL(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLCALL(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLCALL(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ENGINE->GetShadowMap()->depthTexture, 0); // Allocate 16-bit depth buffer GLCALL(glRenderbufferStorage, GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, depthMap_width, depthMap_height); // Attach the render buffer as depth buffer - will be ignored GLCALL(glFramebufferRenderbuffer, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { // GLCALL ASSERT(0, "Framebuffer OK"); } #if MULTISAMPLING_ENABLED //Generate our MSAA Frame and Render buffers glGenFramebuffers(1, &msaaFramebuffer); glGenRenderbuffers(1, &msaaRenderBuffer); //Bind our MSAA buffers glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderBuffer); unsigned int numSamples = 4; // Generate the msaaDepthBuffer. // numSamples will be the number of pixels that the MSAA buffer will use in order to make one pixel on the render buffer. glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, numSamples, GL_RGB5_A1, FRAMEWORK->GetDeviceProperties()->GetWidthPixels(), FRAMEWORK->GetDeviceProperties()->GetHeightPixels()); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderBuffer); glGenRenderbuffers(1, &msaaDepthBuffer); //Bind the msaa depth buffer. glBindRenderbuffer(GL_RENDERBUFFER, msaaDepthBuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, numSamples, GL_DEPTH_COMPONENT16, FRAMEWORK->GetDeviceProperties()->GetWidthPixels() , FRAMEWORK->GetDeviceProperties()->GetHeightPixels()); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msaaDepthBuffer); #endif }
void CreateRenderingSurfaceGLES(EAGLSurfaceDesc* surface) { gDefaultFBO = surface->systemFramebuffer; GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->systemFramebuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->systemRenderbuffer) ); DestroyRenderingSurfaceGLES(surface); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->systemFramebuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->systemRenderbuffer) ); if( surface->targetW != surface->systemW || surface->targetH != surface->systemH ) { GLES_CHK( glGenTextures(1, &surface->targetRT) ); GLES_CHK( glBindTexture(GL_TEXTURE_2D, surface->targetRT) ); GLES_CHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GLES_UPSCALE_FILTER) ); GLES_CHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES_UPSCALE_FILTER) ); GLES_CHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ); GLES_CHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) ); GLenum fmt = surface->use32bitColor ? GL_RGBA : GL_RGB; GLenum type = surface->use32bitColor ? GL_UNSIGNED_BYTE : GL_UNSIGNED_SHORT_5_6_5; GLES_CHK( glTexImage2D(GL_TEXTURE_2D, 0, fmt, surface->targetW, surface->targetH, 0, fmt, type, 0) ); GLES_CHK( glGenFramebuffersOES(1, &surface->targetFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->targetFramebuffer) ); GLES_CHK( glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, surface->targetRT, 0) ); GLES_CHK( glBindTexture(GL_TEXTURE_2D, 0) ); gDefaultFBO = surface->targetFramebuffer; } #if GL_APPLE_framebuffer_multisample if(_supportsMSAA && surface->msaaSamples > 1) { GLES_CHK( glGenRenderbuffersOES(1, &surface->msaaRenderbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); GLES_CHK( glGenFramebuffersOES(1, &surface->msaaFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->msaaFramebuffer) ); GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, surface->format, surface->targetW, surface->targetH) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); gDefaultFBO = surface->msaaFramebuffer; } #endif GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); if(surface->depthFormat != 0) { GLES_CHK( glGenRenderbuffersOES(1, &surface->depthbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->depthbuffer) ); bool needMSAA = GL_APPLE_framebuffer_multisample && (surface->msaaSamples > 1); #if GL_APPLE_framebuffer_multisample if(needMSAA) GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, surface->depthFormat, surface->targetW, surface->targetH) ); #endif if(!needMSAA) GLES_CHK( glRenderbufferStorageOES(GL_RENDERBUFFER_OES, surface->depthFormat, surface->targetW, surface->targetH) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->depthbuffer) ); } }