void RB_PostProcessing( void ) { //GLenum target; //int width, height; //Com_Printf("count %d\n", tr.drawSurfsCount); if ( tr.drawSurfsCount != 0 ) { //return; } if ( !r_enablePostProcess->integer || !glsl ) { return; } if ( !r_enableBloom->integer ) { return; } //qglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // since bloom is using readpixels() if (tr.usingMultiSample) { qglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, tr.frameBufferMultiSample); qglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, tr.frameBuffer); if (tr.usingFboStencil) { // packed depth stencil, but apparently some cards have a problem // if GL_STENCIL_BUFFER_BIT used qglBlitFramebufferEXT(0, 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); } else { qglBlitFramebufferEXT(0, 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); } //qglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, tr.frameBuffer); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, tr.frameBuffer); } RB_Bloom(); // anti alias 2d if (tr.usingMultiSample) { qglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, tr.frameBufferMultiSample); qglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, tr.frameBuffer); if (0) { //(tr.usingFboStencil) { // packed depth stencil, but apparently some cards have a problem // if GL_STENCIL_BUFFER_BIT used qglBlitFramebufferEXT(0, 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); } else { qglBlitFramebufferEXT(0, 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); } //qglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, tr.frameBuffer); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, tr.frameBufferMultiSample); } }
void FBO_FastBlit(FBO_t *src, ivec4_t srcBox, FBO_t *dst, ivec4_t dstBox, int buffers, int filter) { ivec4_t srcBoxFinal, dstBoxFinal; GLuint srcFb, dstFb; if (!glRefConfig.framebufferBlit) { FBO_Blit(src, srcBox, NULL, dst, dstBox, NULL, NULL, 0); return; } // get to a neutral state first //FBO_Bind(NULL); srcFb = src ? src->frameBuffer : 0; dstFb = dst ? dst->frameBuffer : 0; if (!srcBox) { if (src) { VectorSet4(srcBoxFinal, 0, 0, src->width, src->height); } else { VectorSet4(srcBoxFinal, 0, 0, glConfig.vidWidth, glConfig.vidHeight); } } else { VectorSet4(srcBoxFinal, srcBox[0], srcBox[1], srcBox[0] + srcBox[2], srcBox[1] + srcBox[3]); } if (!dstBox) { if (dst) { VectorSet4(dstBoxFinal, 0, 0, dst->width, dst->height); } else { VectorSet4(dstBoxFinal, 0, 0, glConfig.vidWidth, glConfig.vidHeight); } } else { VectorSet4(dstBoxFinal, dstBox[0], dstBox[1], dstBox[0] + dstBox[2], dstBox[1] + dstBox[3]); } qglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, srcFb); qglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, dstFb); qglBlitFramebufferEXT(srcBoxFinal[0], srcBoxFinal[1], srcBoxFinal[2], srcBoxFinal[3], dstBoxFinal[0], dstBoxFinal[1], dstBoxFinal[2], dstBoxFinal[3], buffers, filter); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glState.currentFBO = NULL; }
/* * RFB_BlitObject * * The target FBO must be equal or greater in both dimentions than * the currently bound FBO! */ void RFB_BlitObject( int dest, int bitMask, int mode ) { int bits; int dx, dy, dw, dh; r_fbo_t *fbo = r_bound_framebuffer_object, *destfbo = r_framebuffer_objects + dest - 1; if( !r_bound_framebuffer_object ) { return; } if( !glConfig.ext.framebuffer_blit ) { return; } assert( dest > 0 && dest <= r_num_framebuffer_objects ); if( dest <= 0 || dest > r_num_framebuffer_objects ) { return; } bits = bitMask; if( !bits ) { return; } RB_ApplyScissor(); switch( mode ) { case FBO_COPY_CENTREPOS: dx = (destfbo->width - fbo->width) / 2; dy = (destfbo->height - fbo->height) / 2; dw = fbo->width; dh = fbo->height; break; case FBO_COPY_INVERT_Y: dx = 0; dy = destfbo->height - fbo->height; dw = fbo->width; dh = fbo->height; break; default: dx = 0; dy = 0; dw = fbo->width; dh = fbo->height; break; } qglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, fbo->objectID ); qglBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, destfbo->objectID ); qglBlitFramebufferEXT( 0, 0, fbo->width, fbo->height, dx, dy, dx + dw, dy + dh, bits, GL_NEAREST ); qglBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo->objectID ); assert( qglGetError() == GL_NO_ERROR ); }
/* * RFB_BlitObject * * The target FBO must be equal or greater in both dimentions than * the currently bound FBO! */ void RFB_BlitObject( int src, int dest, int bitMask, int mode, int filter, int readAtt, int drawAtt ) { int bits; int destObj; int dx, dy, dw, dh; r_fbo_t scrfbo; r_fbo_t *fbo; r_fbo_t *destfbo; if( !glConfig.ext.framebuffer_blit ) { return; } assert( src >= 0 && src <= r_num_framebuffer_objects ); if( src < 0 || src > r_num_framebuffer_objects ) { return; } if( src == 0 ) { fbo = &scrfbo; } else { fbo = r_framebuffer_objects + src - 1; } assert( dest >= 0 && dest <= r_num_framebuffer_objects ); if( dest < 0 || dest > r_num_framebuffer_objects ) { return; } if( dest ) { destfbo = r_framebuffer_objects + dest - 1; } else { destfbo = NULL; } bits = bitMask; if( !bits ) { return; } RB_ApplyScissor(); if( src == 0 ) { memset( fbo, 0, sizeof( *fbo ) ); fbo->width = glConfig.width; fbo->height = glConfig.height; } if( destfbo ) { dw = destfbo->width; dh = destfbo->height; destObj = destfbo->objectID; } else { dw = glConfig.width; dh = glConfig.height; destObj = 0; } switch( mode ) { case FBO_COPY_CENTREPOS: dx = ( dw - fbo->width ) / 2; dy = ( dh - fbo->height ) / 2; dw = fbo->width; dh = fbo->height; break; case FBO_COPY_INVERT_Y: dx = 0; dy = dh - fbo->height; dw = fbo->width; dh = fbo->height; break; case FBO_COPY_NORMAL_DST_SIZE: dx = 0; dy = 0; //dw = dw; //dh = dh; break; default: dx = 0; dy = 0; dw = fbo->width; dh = fbo->height; break; } qglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, fbo->objectID ); qglBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, destObj ); #ifndef GL_ES_VERSION_2_0 if( src == 0 ) { qglReadBuffer( GL_BACK ); qglDrawBuffer( GL_COLOR_ATTACHMENT0_EXT + drawAtt ); } else { qglReadBuffer( GL_COLOR_ATTACHMENT0_EXT + readAtt ); qglDrawBuffer( GL_COLOR_ATTACHMENT0_EXT + drawAtt ); } #endif qglBlitFramebufferEXT( 0, 0, fbo->width, fbo->height, dx, dy, dx + dw, dy + dh, bits, filter ); qglBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 ); qglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo->objectID ); #ifndef GL_ES_VERSION_2_0 if( src == 0 ) { qglReadBuffer( GL_BACK ); qglDrawBuffer( GL_BACK ); } else { qglReadBuffer( GL_COLOR_ATTACHMENT0_EXT ); qglDrawBuffer( GL_COLOR_ATTACHMENT0_EXT ); } #endif assert( qglGetError() == GL_NO_ERROR ); }