00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef FramebufferObject_INCLUDE_ONCE
00033 #define FramebufferObject_INCLUDE_ONCE
00034
00035 #include <vlGraphics/Camera.hpp>
00036 #include <vlGraphics/Texture.hpp>
00037 #include <set>
00038 #include <map>
00039
00040 namespace vl
00041 {
00042 class FramebufferObject;
00043
00044
00045
00049 class VLGRAPHICS_EXPORT FBOAbstractAttachment: public Object
00050 {
00051 VL_INSTRUMENT_ABSTRACT_CLASS(vl::FBOAbstractAttachment, Object)
00052
00053 friend class FramebufferObject;
00054
00055 private:
00056
00057 FBOAbstractAttachment( const FBOAbstractAttachment& other ): Object( other ) {}
00058 void operator=( const FBOAbstractAttachment& ) {}
00059
00060 public:
00062 FBOAbstractAttachment() {}
00063
00065 virtual ~FBOAbstractAttachment() { VL_CHECK(fboFramebuffers().size() == 0); }
00066
00068 virtual void unbindFromAllFBO();
00069
00071 const std::set< ref<FramebufferObject> >& fboFramebuffers() const { return mFramebufferObjects; }
00072
00073 protected:
00074 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point ) = 0;
00075
00076 protected:
00077 std::set< ref<FramebufferObject> > mFramebufferObjects;
00078 };
00079
00080
00081
00087 class VLGRAPHICS_EXPORT FBORenderbufferAttachment: public FBOAbstractAttachment
00088 {
00089 VL_INSTRUMENT_ABSTRACT_CLASS(vl::FBORenderbufferAttachment, FBOAbstractAttachment)
00090
00091 friend class FramebufferObject;
00092
00093 public:
00095 FBORenderbufferAttachment(): mHandle( 0 ), mWidth( 0 ), mHeight( 0 ), mSamples( 0 ), mReallocateRenderbuffer( true ) {}
00096
00098 ~FBORenderbufferAttachment() { deleteRenderBuffer(); }
00099
00104 void createRenderBuffer();
00105
00107 void deleteRenderBuffer();
00108
00113 void setHandle( GLuint handle ) { if ( mHandle != handle ) { mHandle = handle; mReallocateRenderbuffer = false; } }
00114
00116 GLuint handle() const { return mHandle; }
00117
00125 void initStorage( int w, int h, int samples );
00126
00128 void initStorage() { initStorage( width(), height(), samples() ); }
00129
00135 int width() const { return mWidth; }
00136
00142 int height() const { return mHeight; }
00143
00149 int samples() const { return mSamples; }
00150
00155 void setWidth( int w ) { if ( w != mWidth ) mReallocateRenderbuffer = true; mWidth = w; }
00156
00161 void setHeight( int h ) { if ( h != mHeight ) mReallocateRenderbuffer = true; mHeight = h; }
00162
00166 void setSamples( int samples ) { if ( samples != mSamples ) mReallocateRenderbuffer = true; mSamples = samples; }
00167
00169 bool renderbufferStorageReady() const { return !mReallocateRenderbuffer; }
00170
00171 protected:
00172 void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00173 virtual int internalType() = 0;
00174
00175 protected:
00176 GLuint mHandle;
00177 int mWidth;
00178 int mHeight;
00179 int mSamples;
00180 bool mReallocateRenderbuffer;
00181 };
00182
00183
00184
00188 class VLGRAPHICS_EXPORT FBOColorBufferAttachment: public FBORenderbufferAttachment
00189 {
00190 VL_INSTRUMENT_CLASS(vl::FBOColorBufferAttachment, FBOColorBufferAttachment)
00191
00192 public:
00194 FBOColorBufferAttachment( EColorBufferFormat type = CBF_RGBA )
00195 {
00196 VL_DEBUG_SET_OBJECT_NAME()
00197 mType = type;
00198 }
00199
00201 void setType( EColorBufferFormat type ) { if ( type != mType ) mReallocateRenderbuffer = true; mType = type; }
00202
00204 EColorBufferFormat type() const { return mType; }
00205
00206 protected:
00207 virtual int internalType() { return type(); }
00208
00209 protected:
00210 EColorBufferFormat mType;
00211 };
00212
00213
00214
00218 class VLGRAPHICS_EXPORT FBODepthBufferAttachment: public FBORenderbufferAttachment
00219 {
00220 VL_INSTRUMENT_CLASS(vl::FBODepthBufferAttachment, FBORenderbufferAttachment)
00221
00222 public:
00224 FBODepthBufferAttachment( EDepthBufferFormat type = DBF_DEPTH_COMPONENT )
00225 {
00226 VL_DEBUG_SET_OBJECT_NAME()
00227 mType = type;
00228 }
00229
00231 void setType( EDepthBufferFormat type ) { if ( type != mType ) mReallocateRenderbuffer = true; mType = type; }
00232
00234 EDepthBufferFormat type() const { return mType; }
00235
00236 protected:
00237 virtual int internalType() { return type(); }
00238
00239 protected:
00240 EDepthBufferFormat mType;
00241 };
00242
00243
00244
00248 class VLGRAPHICS_EXPORT FBOStencilBufferAttachment: public FBORenderbufferAttachment
00249 {
00250 VL_INSTRUMENT_CLASS(vl::FBOStencilBufferAttachment, FBORenderbufferAttachment)
00251
00252 public:
00254 FBOStencilBufferAttachment( EStencilBufferFormat type = SBF_STENCIL_INDEX8 )
00255 {
00256 VL_DEBUG_SET_OBJECT_NAME()
00257 mType = type;
00258 }
00259
00261 void setType( EStencilBufferFormat type ) { if ( type != mType ) mReallocateRenderbuffer = true; mType = type; }
00262
00264 EStencilBufferFormat type() const { return mType; }
00265
00266 protected:
00267 virtual int internalType() { return type(); }
00268
00269 protected:
00270 EStencilBufferFormat mType;
00271 };
00272
00273
00274
00278 class VLGRAPHICS_EXPORT FBODepthStencilBufferAttachment: public FBORenderbufferAttachment
00279 {
00280 VL_INSTRUMENT_CLASS(vl::FBODepthStencilBufferAttachment, FBORenderbufferAttachment)
00281
00282 public:
00284 FBODepthStencilBufferAttachment( EDepthStencilBufferFormat type = DSBT_DEPTH_STENCIL )
00285 {
00286 VL_DEBUG_SET_OBJECT_NAME()
00287 mType = type;
00288 }
00289
00291 void setType( EDepthStencilBufferFormat type ) { if ( type != mType ) mReallocateRenderbuffer = true; mType = type; }
00292
00294 EDepthStencilBufferFormat type() const { return mType; }
00295
00296 protected:
00297 virtual int internalType() { return type(); }
00298
00299 protected:
00300 EDepthStencilBufferFormat mType;
00301 };
00302
00303
00304
00308 class VLGRAPHICS_EXPORT FBOAbstractTextureAttachment: public FBOAbstractAttachment
00309 {
00310 VL_INSTRUMENT_ABSTRACT_CLASS(vl::FBOAbstractTextureAttachment, FBOAbstractAttachment)
00311
00312 public:
00314 FBOAbstractTextureAttachment( Texture* texture, int mipmap_level ): mTexture(texture), mMipmapLevel(mipmap_level)
00315 {
00316 VL_DEBUG_SET_OBJECT_NAME()
00317 }
00318
00320 void setTexture( Texture* texture ) { mTexture = texture; }
00321
00323 Texture* texture() { return mTexture.get(); }
00324
00326 const Texture* texture() const { return mTexture.get(); }
00327
00329 void setMipmapLevel( int mipmap_level ) { mMipmapLevel = mipmap_level; }
00330
00332 int mipmapLevel() const { return mMipmapLevel; }
00333
00334 protected:
00335 ref<Texture> mTexture;
00336 int mMipmapLevel;
00337 };
00338
00339
00340
00345 class VLGRAPHICS_EXPORT FBOTexture1DAttachment: public FBOAbstractTextureAttachment
00346 {
00347 VL_INSTRUMENT_CLASS(vl::FBOTexture1DAttachment, FBOAbstractTextureAttachment)
00348
00349 public:
00351 FBOTexture1DAttachment(): FBOAbstractTextureAttachment( NULL, 0 )
00352 {
00353 VL_DEBUG_SET_OBJECT_NAME()
00354 }
00355
00357 FBOTexture1DAttachment( Texture* texture, int mipmap_level ): FBOAbstractTextureAttachment( texture, mipmap_level )
00358 {
00359 VL_DEBUG_SET_OBJECT_NAME()
00360 }
00361
00362 protected:
00363 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00364 };
00365
00366
00367
00372 class VLGRAPHICS_EXPORT FBOTexture2DAttachment: public FBOAbstractTextureAttachment
00373 {
00374 VL_INSTRUMENT_CLASS(vl::FBOTexture2DAttachment, FBOAbstractTextureAttachment)
00375
00376 public:
00378 FBOTexture2DAttachment( ): FBOAbstractTextureAttachment( NULL, 0 )
00379 {
00380 VL_DEBUG_SET_OBJECT_NAME()
00381 mTextureTarget = T2DT_TEXTURE_2D;
00382 }
00383
00385 FBOTexture2DAttachment( Texture* texture, int mipmap_level, ETex2DTarget target ): FBOAbstractTextureAttachment( texture, mipmap_level )
00386 {
00387 VL_DEBUG_SET_OBJECT_NAME()
00388 mTextureTarget = target;
00389 }
00390
00392 void setTextureTarget( ETex2DTarget target ) { mTextureTarget = target; }
00393
00395 ETex2DTarget textureTarget() const { return mTextureTarget; }
00396
00397 protected:
00398 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00399
00400 protected:
00401 ETex2DTarget mTextureTarget;
00402 };
00403
00404
00405
00410 class VLGRAPHICS_EXPORT FBOTextureAttachment: public FBOAbstractTextureAttachment
00411 {
00412 VL_INSTRUMENT_CLASS(vl::FBOTextureAttachment, FBOAbstractTextureAttachment)
00413
00414 public:
00416 FBOTextureAttachment(): FBOAbstractTextureAttachment( NULL, 0 )
00417 {
00418 VL_DEBUG_SET_OBJECT_NAME()
00419 }
00420
00422 FBOTextureAttachment( Texture* texture, int mipmap_level ): FBOAbstractTextureAttachment( texture, mipmap_level )
00423 {
00424 VL_DEBUG_SET_OBJECT_NAME()
00425 }
00426
00427 protected:
00428 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00429
00430 };
00431
00432
00433
00438 class VLGRAPHICS_EXPORT FBOTexture3DAttachment: public FBOAbstractTextureAttachment
00439 {
00440 VL_INSTRUMENT_CLASS(vl::FBOTexture3DAttachment, FBOAbstractTextureAttachment)
00441
00442 public:
00443 FBOTexture3DAttachment(): FBOAbstractTextureAttachment( NULL, 0 )
00444 {
00445 VL_DEBUG_SET_OBJECT_NAME()
00446 mLayer = 0;
00447 }
00448
00449 FBOTexture3DAttachment( Texture* texture, int mipmap_level, int layer ): FBOAbstractTextureAttachment( texture, mipmap_level )
00450 {
00451 VL_DEBUG_SET_OBJECT_NAME()
00452 mLayer = layer;
00453 }
00454
00456 void setLayer( int layer ) { mLayer = layer; }
00457
00459 int layer() const { return mLayer; }
00460
00461 protected:
00462 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00463
00464 protected:
00465 int mLayer;
00466 };
00467
00468
00469
00474 class VLGRAPHICS_EXPORT FBOTextureLayerAttachment: public FBOAbstractTextureAttachment
00475 {
00476 VL_INSTRUMENT_CLASS(vl::FBOTextureLayerAttachment, FBOAbstractTextureAttachment)
00477
00478 public:
00480 FBOTextureLayerAttachment(): FBOAbstractTextureAttachment( NULL, 0 )
00481 {
00482 VL_DEBUG_SET_OBJECT_NAME()
00483 mLayer = 0;
00484 }
00485
00487 FBOTextureLayerAttachment( Texture* texture, int mipmap_level, int layer ): FBOAbstractTextureAttachment( texture, mipmap_level )
00488 {
00489 VL_DEBUG_SET_OBJECT_NAME()
00490 mLayer = layer;
00491 }
00492
00494 int layer() const { return mLayer; }
00495
00497 void setLayer( int layer ) { mLayer = layer; }
00498
00499 protected:
00500 virtual void bindAttachment( FramebufferObject* fbo, EAttachmentPoint attach_point );
00501
00502 protected:
00503 ref<Texture> mTexture;
00504 int mMipmapLevel;
00505 int mLayer;
00506 };
00507
00508
00509
00538 class VLGRAPHICS_EXPORT FramebufferObject: public Framebuffer
00539 {
00540 VL_INSTRUMENT_CLASS(vl::FramebufferObject, Framebuffer)
00541
00542 friend class OpenGLContext;
00543
00544 private:
00545 FramebufferObject( const FramebufferObject& other ): Framebuffer( other ), mHandle( 0 ) {}
00546
00547 void operator=( const FramebufferObject& ) {}
00548
00549 FramebufferObject():
00550 Framebuffer( NULL, 0, 0, RDB_COLOR_ATTACHMENT0, RDB_COLOR_ATTACHMENT0 ), mHandle( 0 )
00551 {
00552 VL_DEBUG_SET_OBJECT_NAME()
00553 }
00554
00555 FramebufferObject( OpenGLContext* ctx, int w, int h,
00556 EReadDrawBuffer draw_buffer=RDB_COLOR_ATTACHMENT0,
00557 EReadDrawBuffer read_buffer=RDB_COLOR_ATTACHMENT0 ):
00558 Framebuffer( ctx, w, h, draw_buffer, read_buffer ), mHandle( 0 )
00559 {
00560 VL_DEBUG_SET_OBJECT_NAME()
00561 }
00562
00563 public:
00565 ~FramebufferObject() { if (openglContext()) deleteFBO(); }
00566
00571 void createFBO();
00572
00577 void deleteFBO();
00578
00580 void setHandle( GLuint handle ) { mHandle = handle; }
00581
00583 virtual GLuint handle() const { return mHandle; }
00584
00590 virtual void bindFramebuffer( EFramebufferBind target = FBB_FRAMEBUFFER );
00591
00593 GLenum checkFramebufferStatus();
00594
00596 void printFramebufferError( GLenum status ) const;
00597
00599 void addColorAttachment( EAttachmentPoint attach_point, FBOColorBufferAttachment* attachment );
00600
00602 void addTextureAttachment( EAttachmentPoint attach_point, FBOAbstractTextureAttachment* attachment );
00603
00608 void addDepthAttachment( FBOAbstractAttachment* attachment );
00609
00614 void addStencilAttachment( FBOAbstractAttachment* attachment );
00615
00617 void addDepthStencilAttachment( FBOAbstractAttachment* attachment );
00618
00620 void removeAttachment( FBOAbstractAttachment* attachment );
00621
00623 void removeAttachment( EAttachmentPoint attach_point );
00624
00626 void removeAllAttachments();
00627
00629 const std::map< EAttachmentPoint, ref<FBOAbstractAttachment> >& fboAttachments() const { return mFBOAttachments; }
00630
00631 public:
00632 std::map< EAttachmentPoint, ref<FBOAbstractAttachment> > mFBOAttachments;
00633 GLuint mHandle;
00634 };
00635 }
00636
00637 #endif