void DepthPeelingStage::postProcess(DrawEnv *pEnv, bool isPing) { Window *win = pEnv->getWindow(); if(win->hasExtOrVersion(_uiFramebufferObjectExt, 0x0300, 0x0200) == false) { FNOTICE(("Framebuffer objects not supported on Window %p!\n", win)); return; } DepthPeelingStageData *pData = pEnv->getData<DepthPeelingStageData *>(_iDataSlotId); if(!pData) return; FrameBufferObject *pBlendFBO = pData->getBlendFBO(); pBlendFBO->activate(pEnv); ChunkMaterial *pMaterial; if (isPing) pMaterial = pData->getPeelPingMaterial(); else pMaterial = pData->getPeelPongMaterial(); pEnv->activateState(pMaterial->getState(), NULL); drawQuad(); pEnv->deactivateState(); pBlendFBO->deactivate(pEnv); }
void HDRStage::postProcess(DrawEnv *pEnv) { UInt32 uiActiveFBO = pEnv->getActiveFBO(); Window *win = pEnv->getWindow(); if(win->hasExtOrVersion(_uiFramebufferObjectExt, 0x0300, 0x0200) == false) { FNOTICE(("Framebuffer objects not supported on Window %p!\n", static_cast<void *>(win))); return; } OSGGETGLFUNCBYID_GL3( glDrawBuffers, osgGlDrawBuffers, _uiFuncDrawBuffers, win); glColor3f(1.f, 1.f, 1.f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); HDRStageData *pData = pEnv->getData<HDRStageData *>(_iDataSlotId); if(pData == NULL) { return; } // Shrink to w/2 h/2 FrameBufferObject *pShrinkTarget = pData->getShrinkRenderTarget(); ChunkMaterial *pSHM = pData->getShrinkMaterial(); pShrinkTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 2, pEnv->getPixelHeight() / 2); State *pShrinkState = pSHM->getState(); pEnv->activateState(pShrinkState, NULL); this->renderQuad(); pShrinkTarget->deactivate(pEnv); // Shrink to w/4 h/4 FrameBufferObject *pBlurTarget = pData->getBlurRenderTarget(); pBlurTarget->editMFDrawBuffers()->clear(); pBlurTarget->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT); pBlurTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 4, pEnv->getPixelHeight() / 4); ChunkMaterial *pBLM = pData->getBlurMaterial(); State *pBlurState = pBLM->getState(); pEnv->activateState(pBlurState, NULL); this->renderQuad(); GLenum aDrawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT }; // HBlur pBlurTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 4, pEnv->getPixelHeight() / 4); #define OVERSHADER 1 #if OVERSHADER StateOverride oOverride; oOverride.addOverride(pData->getHBlurShader()->getClassId(), pData->getHBlurShader()); pEnv->activateState(pBlurState, &oOverride); #else pData->getHBlurShader()->activate(pEnv); #endif aDrawBuffers[0] = GL_COLOR_ATTACHMENT1_EXT; osgGlDrawBuffers(1, aDrawBuffers); this->renderQuad(); #if !OVERSHADER pData->getHBlurShader()->deactivate(pEnv); #endif // VBlur #if OVERSHADER StateOverride oOverride1; oOverride1.addOverride(pData->getVBlurShader()->getClassId(), pData->getVBlurShader()); pEnv->activateState(pBlurState, &oOverride1); #else pData->getVBlurShader()->activate(pEnv); #endif aDrawBuffers[0] = GL_COLOR_ATTACHMENT0_EXT; osgGlDrawBuffers(1, aDrawBuffers); this->renderQuad(); #if !OVERSHADER pData->getVBlurShader()->deactivate(pEnv); #endif if(uiActiveFBO == 0) { pBlurTarget->deactivate(pEnv); } else { FrameBufferObject::activateFBOById(pEnv, uiActiveFBO); } // Tonemap pass glDisable(GL_DEPTH_TEST); glViewport(pEnv->getPixelLeft (), pEnv->getPixelBottom(), pEnv->getPixelWidth (), pEnv->getPixelHeight()); ChunkMaterial *pTCM = pData->getToneMappingMaterial(); State *pTState = pTCM->getState(); pEnv->activateState(pTState, NULL); this->renderQuad(); glEnable(GL_DEPTH_TEST); pEnv->deactivateState(); glPopMatrix(); }
void HDRStage::postProcess(DrawEnv *pEnv) { Window *win = pEnv->getWindow(); if(win->hasExtension(_uiFramebuffer_object_extension) == false) { FNOTICE(("Framebuffer objects not supported on Window %p!\n", win)); return; } GLDrawBuffersEXTProcT glDrawBuffersEXTProc = reinterpret_cast<GLDrawBuffersEXTProcT>( win->getFunction(_uiFuncDrawBuffers)); glColor3f(1.f, 1.f, 1.f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); HDRStageData *pData = pEnv->getData<HDRStageData *>(_iDataSlotId); if(pData == NULL) { return; } if((pData->getWidth () != pEnv->getPixelWidth() ) || (pData->getHeight() != pEnv->getPixelHeight()) ) { resizeStageData(pData, pEnv->getPixelWidth(), pEnv->getPixelHeight()); } // Shrink to w/2 h/2 FrameBufferObject *pShrinkTarget = pData->getShrinkRenderTarget(); ChunkMaterial *pSHM = pData->getShrinkMaterial(); pShrinkTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 2, pEnv->getPixelHeight() / 2); State *pShrinkState = pSHM->getState(); pEnv->activateState(pShrinkState, NULL); glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); pShrinkTarget->deactivate(pEnv); // Shrink to w/4 h/4 FrameBufferObject *pBlurTarget = pData->getBlurRenderTarget(); pBlurTarget->editMFDrawBuffers()->clear(); pBlurTarget->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT); pBlurTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 4, pEnv->getPixelHeight() / 4); ChunkMaterial *pBLM = pData->getBlurMaterial(); State *pBlurState = pBLM->getState(); pEnv->activateState(pBlurState, NULL); glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); // HBlur StateOverride oOverride; GLenum aDrawBuffers[] = { GL_COLOR_ATTACHMENT1_EXT }; oOverride.addOverride(pData->getHBlurShader()->getClassId(), pData->getHBlurShader()); pEnv->activateState(pBlurState, &oOverride); glDrawBuffersEXTProc(1, aDrawBuffers); glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); // VBlur StateOverride oOverride1; oOverride1.addOverride(pData->getVBlurShader()->getClassId(), pData->getVBlurShader()); pEnv->activateState(pBlurState, &oOverride1); aDrawBuffers[0] = GL_COLOR_ATTACHMENT0_EXT; glDrawBuffersEXTProc(1, aDrawBuffers); glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); pBlurTarget->deactivate(pEnv); // Tonemap pass glDisable(GL_DEPTH_TEST); glViewport(pEnv->getPixelLeft (), pEnv->getPixelBottom(), pEnv->getPixelWidth (), pEnv->getPixelHeight()); ChunkMaterial *pTCM = pData->getToneMappingMaterial(); State *pTState = pTCM->getState(); pEnv->activateState(pTState, NULL); glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); glEnable(GL_DEPTH_TEST); pEnv->deactivateState(); glPopMatrix(); }
void DisplayFilterStage::postProcess(DrawEnv *pEnv) { DisplayFilterStageData *pData = pEnv->getData<DisplayFilterStageData *>(_iDataSlotId); if(pData == NULL) return; ColorDisplayFilter *pColFilter = pData->getColFilter (); DistortionDisplayFilter *pDistFilter = pData->getDistFilter(); ChunkMaterial *pSourceMat = pData->getBaseMaterial(); State *pSourceState = pSourceMat->getState(); glClearColor(0.f, 0.f, 0.f, 1.f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.f, 0.f, 0.f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if(pColFilter != NULL) { pColFilter->process(pData); } pEnv->activateState(pSourceState, NULL); if(pColFilter == NULL) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } if(pDistFilter != NULL) { pDistFilter->process(pData); } else { glBegin(GL_QUADS); { glTexCoord2f(0.00, 0.00); glVertex2f (0.00, 0.00); glTexCoord2f(1.00, 0.00); glVertex2f (1.00, 0.00); glTexCoord2f(1.00, 1.00); glVertex2f (1.00, 1.00); glTexCoord2f(0.00, 1.00); glVertex2f (0.00, 1.00); } glEnd(); } if(pColFilter == NULL) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } pEnv->deactivateState(); glPopMatrix(); }