void rtt::stop_draw() { check_fbo(current_buffer); if(current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::NONE && current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::SSAA_2 && current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::SSAA_4 && current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::FXAA && current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::SSAA_4_3_FXAA && current_buffer->anti_aliasing[0] != TEXTURE_ANTI_ALIASING::SSAA_2_FXAA) { if(current_buffer->depth_type == DEPTH_TYPE::RENDERBUFFER || current_buffer->depth_type == DEPTH_TYPE::TEXTURE_2D) { glBindFramebuffer(GL_READ_FRAMEBUFFER, current_buffer->fbo_id); for(size_t i = 0; i < current_buffer->attachment_count; i++) { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_buffer->resolve_buffer[i]); #if !defined(FLOOR_IOS) || defined(PLATFORM_X64) glBlitFramebuffer(0, 0, (int)current_buffer->draw_width, (int)current_buffer->draw_height, 0, 0, (int)current_buffer->draw_width, (int)current_buffer->draw_height, GL_COLOR_BUFFER_BIT, GL_NEAREST); #else glResolveMultisampleFramebufferAPPLE(); #endif } #if defined(FLOOR_IOS) #if !defined(PLATFORM_X64) // can only have one attachment static const array<GLenum, 2> discards {{ GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT }}; #else // can have multiple color attachments vector<GLenum> discards { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT }; for(size_t i = 1; i < current_buffer->attachment_count; i++) { discards.emplace_back(GL_COLOR_ATTACHMENT0 + i); } #endif glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, (int)discards.size(), &discards[0]); #endif } } for(unsigned int i = 0; i < current_buffer->attachment_count; i++) { if(current_buffer->auto_mipmap[i]) { // TODO: fix this //glBindTexture(current_buffer->target[i], current_buffer->tex[i]); //glGenerateMipmap(current_buffer->target[i]); } } glBindFramebuffer(GL_FRAMEBUFFER, 0); }
void PreparePresentSurfaceGLES(EAGLSurfaceDesc* surface) { #if GL_APPLE_framebuffer_multisample if( surface->msaaSamples > 0 && _supportsMSAA ) { Profiler_StartMSAAResolve(); UNITY_DBG_LOG (" ResolveMSAA: samples=%i msaaFBO=%i destFBO=%i\n", surface->msaaSamples, surface->msaaFramebuffer, surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, surface->msaaFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, surface->framebuffer) ); GLES_CHK( glResolveMultisampleFramebufferAPPLE() ); Profiler_EndMSAAResolve(); } #endif // update screenshot here if( UnityIsCaptureScreenshotRequested() ) { GLint curfb = 0; GLES_CHK( glGetIntegerv(GL_FRAMEBUFFER_BINDING, &curfb) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); UnityCaptureScreenshot(); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, curfb) ); } #if GL_EXT_discard_framebuffer if( _supportsDiscard ) { GLenum attachments[3]; int discardCount = 0; if (surface->msaaSamples > 1 && _supportsMSAA) attachments[discardCount++] = GL_COLOR_ATTACHMENT0_OES; if (surface->depthFormat) attachments[discardCount++] = GL_DEPTH_ATTACHMENT_OES; attachments[discardCount++] = GL_STENCIL_ATTACHMENT_OES; GLenum target = (surface->msaaSamples > 1 && _supportsMSAA) ? GL_READ_FRAMEBUFFER_APPLE: GL_FRAMEBUFFER_OES; if (discardCount > 0) { GLES_CHK( glDiscardFramebufferEXT(target, discardCount, attachments) ); } } #endif }
void GLESFrameBufferObject::swapBuffers() { #if GL_APPLE_framebuffer_multisample if (mMultisampleFB) { // blit from multisample buffer to final buffer, triggers resolve glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, mMultisampleFB); GL_CHECK_ERROR; glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, mFB); GL_CHECK_ERROR; glResolveMultisampleFramebufferAPPLE(); GL_CHECK_ERROR; // glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); } #endif }
extern "C" bool UnityResolveMSAA(GLuint destFBO, GLuint colorTex, GLuint colorBuf, GLuint depthTex, GLuint depthBuf) { #if GL_APPLE_framebuffer_multisample if (_surface.msaaSamples > 0 && _supportsMSAA && destFBO!=_surface.msaaFramebuffer && destFBO!=_surface.framebuffer) { Profiler_StartMSAAResolve(); GLint oldFBO; GLES_CHK( glGetIntegerv (GL_FRAMEBUFFER_BINDING_OES, &oldFBO) ); UNITY_DBG_LOG ("UnityResolveMSAA: samples=%i msaaFBO=%i destFBO=%i colorTex=%i colorRB=%i depthTex=%i depthRB=%i\n", _surface.msaaSamples, _surface.msaaFramebuffer, destFBO, colorTex, colorBuf, depthTex, depthBuf); UNITY_DBG_LOG (" bind dest as DRAW FBO and textures/buffers into it\n"); GLES_CHK( glBindFramebufferOES (GL_DRAW_FRAMEBUFFER_APPLE, destFBO) ); if (colorTex) GLES_CHK( glFramebufferTexture2DOES( GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0 ) ); else if (colorBuf) GLES_CHK( glFramebufferRenderbufferOES (GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuf) ); if (depthTex) GLES_CHK( glFramebufferTexture2DOES( GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0 ) ); else if (depthBuf) GLES_CHK( glFramebufferRenderbufferOES (GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuf) ); UNITY_DBG_LOG (" bind msaa as READ FBO\n"); GLES_CHK( glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, _surface.msaaFramebuffer) ); UNITY_DBG_LOG (" glResolveMultisampleFramebufferAPPLE ();\n"); GLES_CHK( glResolveMultisampleFramebufferAPPLE() ); GLES_CHK( glBindFramebufferOES (GL_FRAMEBUFFER_OES, oldFBO) ); Profiler_EndMSAAResolve(); return true; } #endif return false; }
void RenderingEngine2::resolve_msaa(const GLuint readFBO, const GLuint writeFBO) { #if defined (MSAA_ENABLED) glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, readFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, writeFBO); glResolveMultisampleFramebufferAPPLE(); GLenum discardAttachments[] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT }; glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, discardAttachments); #else GLenum discardAttachments[] = { GL_DEPTH_ATTACHMENT }; glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discardAttachments); #endif }
void RenderScene::RenderScene(RenderLists* renderLists, Camera* camera, DirectionalLight* directionalLight, std::vector<DirectionalLight*> additionalLights) { #ifdef PLATFORM_IOS GLCALL(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &g_default_fbo); #endif std::vector<DirectionalLight*> emptyVector; { // Switch off blend for depth pass: GLCALL(glDisable, GL_BLEND); Camera* depthCamera = ENGINE->GetShadowMap()->GetDepthCamera(); #if defined(DRAWING_DEPTH_BUFFER_CONTENTS) GLCALL(glViewport, 0, 0, FRAMEWORK->GetDeviceProperties()->GetWidthPixels(), FRAMEWORK->GetDeviceProperties()->GetHeightPixels()); GLCALL(glBindFramebuffer, GL_FRAMEBUFFER, SCREEN_FRAME_BUFFER /* default window framebuffer */); #else /* * Draw to the depth buffer: */ unsigned int depthMap_width, depthMap_height; ENGINE->GetShadowMap()->GetDepthMapResolution(depthMap_width, depthMap_height); // GLCALL(glBindFramebuffer, GL_FRAMEBUFFER, g_depth_fbo_id); GLCALL(glViewport, 0, 0, depthMap_width, depthMap_height); GLCALL(glClear, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #endif // Depth pass draw: ENGINE->GetSceneGraph3D()->SetMainCameraId(depthCamera->GetObject()->GetId()); renderLists->Draw(depthCamera, nullptr /* no lights in depth pass */, emptyVector /* no lights in depth pass */, true, DISTANCE_FROM_CAMERA_COMPARE_TYPE_perspective); // Switch blend back on: GLCALL(glEnable, GL_BLEND); } #if MULTISAMPLING_ENABLED glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #endif { #if !defined(DRAWING_DEPTH_BUFFER_CONTENTS) /* * Draw again, this time to the screen: */ ENGINE->GetSceneGraph3D()->SetMainCameraId(camera->GetObject()->GetId()); #if !MULTISAMPLING_ENABLED GLCALL(glBindFramebuffer, GL_FRAMEBUFFER, SCREEN_FRAME_BUFFER /* default window framebuffer */); #endif GLCALL(glViewport, 0, 0, FRAMEWORK->GetDeviceProperties()->GetWidthPixels(), FRAMEWORK->GetDeviceProperties()->GetHeightPixels()); renderLists->Draw(camera, directionalLight, additionalLights, false, DISTANCE_FROM_CAMERA_COMPARE_TYPE_perspective); #endif } #if MULTISAMPLING_ENABLED // Apple (and the khronos group) encourages you to discard depth // render buffer contents whenever is possible const GLenum discard1[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT}; glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, discard1); const GLenum discard2[] = {GL_DEPTH_ATTACHMENT}; glDiscardFramebufferEXT(GL_DRAW_FRAMEBUFFER_APPLE, 1, discard2); //Bind both MSAA and View FrameBuffers. glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, SCREEN_FRAME_BUFFER); // Call a resolve to combine both buffers glResolveMultisampleFramebufferAPPLE(); // Present final image to screen glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); // [context presentRenderbuffer:GL_RENDERBUFFER]; #endif }
void PreparePresentSurfaceGLES(EAGLSurfaceDesc* surface) { #if GL_APPLE_framebuffer_multisample if( surface->msaaSamples > 1 && _supportsMSAA ) { Profiler_StartMSAAResolve(); GLuint drawFB = surface->targetFramebuffer ? surface->targetFramebuffer : surface->systemFramebuffer; GLES_CHK( glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, surface->msaaFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, drawFB) ); GLES_CHK( glResolveMultisampleFramebufferAPPLE() ); Profiler_EndMSAAResolve(); } #endif // update screenshot from target FBO to get requested resolution if( UnityIsCaptureScreenshotRequested() ) { GLint target = surface->targetFramebuffer ? surface->targetFramebuffer : surface->systemFramebuffer; GLint curfb = 0; GLES_CHK( glGetIntegerv(GL_FRAMEBUFFER_BINDING, &curfb) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, target) ); UnityCaptureScreenshot(); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, curfb) ); } if( surface->targetFramebuffer ) { gDefaultFBO = surface->systemFramebuffer; GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); UnityBlitToSystemFB(surface->targetRT, surface->targetW, surface->targetH, surface->systemW, surface->systemH); gDefaultFBO = surface->msaaFramebuffer ? surface->msaaFramebuffer : surface->targetFramebuffer; GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); } #if GL_EXT_discard_framebuffer if( _supportsDiscard ) { GLenum discardAttach[] = {GL_COLOR_ATTACHMENT0_OES, GL_DEPTH_ATTACHMENT_OES, GL_STENCIL_ATTACHMENT_OES}; if( surface->msaaFramebuffer ) GLES_CHK( glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 3, discardAttach) ); if(surface->targetFramebuffer) { GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->targetFramebuffer) ); GLES_CHK( glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 3, discardAttach) ); } GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->systemFramebuffer) ); GLES_CHK( glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 2, &discardAttach[1]) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); } #endif }