llrendertarget.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llrendertarget.h
  3.  * @brief Off screen render target abstraction.  Loose wrapper for GL_EXT_framebuffer_objects.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLRENDERTARGET_H
  33. #define LL_LLRENDERTARGET_H
  34. // LLRenderTarget is unavailible on the mapserver since it uses FBOs.
  35. #if !LL_MESA_HEADLESS
  36. #include "llgl.h"
  37. #include "llrender.h"
  38. /*
  39.  SAMPLE USAGE:
  40. LLRenderTarget target;
  41. ...
  42. //allocate a 256x256 RGBA render target with depth buffer
  43. target.allocate(256,256,GL_RGBA,TRUE);
  44. //render to contents of offscreen buffer
  45. target.bindTarget();
  46. target.clear();
  47. ... <issue drawing commands> ...
  48. target.flush();
  49. ...
  50. //use target as a texture
  51. gGL.getTexUnit(INDEX)->bind(&target);
  52. ... <issue drawing commands> ...
  53. */
  54. class LLMultisampleBuffer;
  55. class LLRenderTarget
  56. {
  57. public:
  58. //whether or not to use FBO implementation
  59. static BOOL sUseFBO; 
  60. LLRenderTarget();
  61. virtual ~LLRenderTarget();
  62. //allocate resources for rendering
  63. //must be called before use
  64. //multiple calls will release previously allocated resources
  65. void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, BOOL use_fbo = FALSE);
  66. //provide this render target with a multisample resource.
  67. void setSampleBuffer(LLMultisampleBuffer* buffer);
  68. //add color buffer attachment
  69. //limit of 4 color attachments per render target
  70. virtual void addColorAttachment(U32 color_fmt);
  71. //allocate a depth texture
  72. virtual void allocateDepth();
  73. //share depth buffer with provided render target
  74. virtual void shareDepthBuffer(LLRenderTarget& target);
  75. //free any allocated resources
  76. //safe to call redundantly
  77. void release();
  78. //bind target for rendering
  79. //applies appropriate viewport
  80. virtual void bindTarget();
  81. //unbind target for rendering
  82. static void unbindTarget();
  83. //clear render targer, clears depth buffer if present,
  84. //uses scissor rect if in copy-to-texture mode
  85. void clear(U32 mask = 0xFFFFFFFF);
  86. //get applied viewport
  87. void getViewport(S32* viewport);
  88. //get X resolution
  89. U32 getWidth() const { return mResX; }
  90. //get Y resolution
  91. U32 getHeight() const { return mResY; }
  92. LLTexUnit::eTextureType getUsage(void) const { return mUsage; }
  93. U32 getTexture(U32 attachment = 0) const;
  94. U32 getDepth(void) const { return mDepth; }
  95. BOOL hasStencil() const { return mStencil; }
  96. void bindTexture(U32 index, S32 channel);
  97. //flush rendering operations
  98. //must be called when rendering is complete
  99. //should be used 1:1 with bindTarget 
  100. // call bindTarget once, do all your rendering, call flush once
  101. // if fetch_depth is TRUE, every effort will be made to copy the depth buffer into 
  102. // the current depth texture.  A depth texture will be allocated if needed.
  103. void flush(BOOL fetch_depth = FALSE);
  104. void copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
  105. S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter);
  106. static void copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
  107. S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter);
  108. //Returns TRUE if target is ready to be rendered into.
  109. //That is, if the target has been allocated with at least
  110. //one renderable attachment (i.e. color buffer, depth buffer).
  111. BOOL isComplete() const;
  112. static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; }
  113. protected:
  114. friend class LLMultisampleBuffer;
  115. U32 mResX;
  116. U32 mResY;
  117. std::vector<U32> mTex;
  118. U32 mFBO;
  119. U32 mDepth;
  120. BOOL mStencil;
  121. BOOL mUseDepth;
  122. BOOL mRenderDepth;
  123. LLTexUnit::eTextureType mUsage;
  124. U32 mSamples;
  125. LLMultisampleBuffer* mSampleBuffer;
  126. static LLRenderTarget* sBoundTarget;
  127. };
  128. class LLMultisampleBuffer : public LLRenderTarget
  129. {
  130. public:
  131. LLMultisampleBuffer();
  132. virtual ~LLMultisampleBuffer();
  133. void releaseSampleBuffer();
  134. virtual void bindTarget();
  135. void bindTarget(LLRenderTarget* ref);
  136. virtual void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo);
  137. void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples);
  138. virtual void addColorAttachment(U32 color_fmt);
  139. virtual void allocateDepth();
  140. };
  141. #endif //!LL_MESA_HEADLESS
  142. #endif