/*===========================================================================*\ * * * OpenFlipper * * Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen * * www.openflipper.org * * * *--------------------------------------------------------------------------- * * This file is part of OpenFlipper. * * * * OpenFlipper is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 3 of * * the License, or (at your option) any later version with the * * following exceptions: * * * * If other files instantiate templates or use macros * * or inline functions from this file, or you compile this file and * * link it with other files to produce an executable, this file does * * not by itself cause the resulting executable to be covered by the * * GNU Lesser General Public License. This exception does not however * * invalidate any other reasons why the executable file might be * * covered by the GNU Lesser General Public License. * * * * OpenFlipper is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU LesserGeneral Public * * License along with OpenFlipper. If not, * * see . * * * \*===========================================================================*/ #pragma once #include #include #include #include #include #include class DepthPeeling : public QObject, BaseInterface, RenderInterface, LoggingInterface, ACG::IRenderer { Q_OBJECT Q_INTERFACES(BaseInterface) Q_INTERFACES(RenderInterface) Q_INTERFACES(LoggingInterface) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.OpenFlipper.Plugins.Plugin-Render-DepthPeeling") #endif signals: // LoggingInterface void log(Logtype _type, QString _message); void log(QString _message); public: DepthPeeling(); ~DepthPeeling(); QString name() { return (QString("DepthPeeling Plugin")); }; QString description( ) { return (QString(tr("DepthPeeling Rendering Pipeline (Alpha Version!)"))); }; /// overide addRenderObject function to include OIT check void addRenderObject(ACG::RenderObject* _renderObject); public slots: QString version() { return QString("1.0"); }; QString renderObjectsInfo(bool _outputShaderInfo) { return dumpCurrentRenderObjectsToString(&sortedObjects_[0],_outputShaderInfo); }; QAction* optionsAction(); private slots: //BaseInterface void initializePlugin(); void exit(){} // RenderInterface void render(ACG::GLState* _glState, Viewer::ViewerProperties& _properties); QString rendererName() {return QString("Alpha_Version_DepthPeeling");} void supportedDrawModes(ACG::SceneGraph::DrawModes::DrawMode& _mode) {_mode = ACG::SceneGraph::DrawModes::DEFAULT;} QString checkOpenGL(); void slotModeChanged( QAction * ); private: /// peel the scene from front to back, one layer per pass void renderFrontPeeling(ACG::GLState* _glState, Viewer::ViewerProperties& _properties); /// peel the scene with dual depth peeling, two layers per pass void renderDualPeeling(ACG::GLState* _glState, Viewer::ViewerProperties& _properties); /// mode: 0 -> front to back peeling, 1 -> dual peeling int peelMode_; bool copyFrontDepth_; /// max peel count int maxPeelCount_; /// blends one depth-layer into the current scene target GLSL::Program* peelBlend_; /// final copy into back-buffer GLSL::Program* peelFinal_; /// occlusion query determining end of peeling (last layer) GLuint peelQueryID_; /// dual depth peeling shaders GLSL::Program* peelBlendDual_; GLSL::Program* peelFinalDual_; /// Collection of framebuffers for each viewport struct ViewerResources { ViewerResources(); ~ViewerResources(); // resize textures void resize(bool _dualPeeling, unsigned int _width, unsigned int _height); /// viewer window width unsigned int width_; /// viewer window height unsigned int height_; // single layer depth peeling textures (front to back peeling) // ping-pong buffer for (depth, front) targets GLuint singleDepthTex_[2]; // float1: minDepth GLuint singleFrontTex_[2]; // rgba: color of front-peeled layer GLuint singleBlendTex_; // rgba: color accumulation buffer ACG::FBO* singleFbo_; // targets: {depth0, front0, depth1, front1, blend} // dual depth peeling textures // ping-pong buffer for (depth, front, back) targets GLuint dualDepthTex_[2]; // float2: (-minDepth, maxDepth) GLuint dualFrontTex_[2]; // rgba: color of front-peeled layer GLuint dualBackTex_[2]; // rgba: color of back-peeled layer GLuint dualBlendTex_; // rgb: color accumulation buffer ACG::FBO* dualFbo_; // targets: {depth0, front0, back0, depth1, front1, back1, blend} }; /// Allocate framebuffers and load shaders for depth-peeling. void initDepthPeeling(); /// Allocate framebuffers and load shaders for dual-depth-peeling. void initDualDepthPeeling(); /** * Stores framebuffer resources for each viewport. * Mapping: viewerID -> ViewerResources */ std::map viewerRes_; // debug functions // GLSL::Program* dbgProg_; // // void dbgDrawTex(GLuint _texID); };