BsRenderTargets.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsRenderBeastPrerequisites.h"
  5. #include "BsPixelUtil.h"
  6. #include "BsRendererView.h"
  7. namespace bs { namespace ct
  8. {
  9. /** @addtogroup RenderBeast
  10. * @{
  11. */
  12. /** Types of render target textures that can be allocated by RenderTargets manager. */
  13. enum RenderTargetType
  14. {
  15. /**
  16. * Buffer containing albedo, normals, metalness/roughness and other material data, populated during base pass and
  17. * used during lighting and other operations.
  18. */
  19. RTT_GBuffer,
  20. /** Buffer containing intermediate lighting information used during deferred lighting pass. */
  21. RTT_LightAccumulation,
  22. /** Buffer containing temporary combined occlusion data for a specific light (from shadow maps or attenuation. */
  23. RTT_LightOcclusion,
  24. /** Buffer containing (potentially multisampled) scene color information. */
  25. RTT_SceneColor,
  26. /**
  27. * Buffer containing non-MSAA final scene color information. If MSAA is not used then this is equivalent to
  28. * RTT_SceneColor;
  29. */
  30. RTT_ResolvedSceneColor,
  31. /**
  32. * Secondary resolved scene color texture that can be used for ping-ponging between primary and secondary scene
  33. * color textures. Primarily useful for post-processing effects.
  34. */
  35. RTT_ResolvedSceneColorSecondary
  36. };
  37. /**
  38. * Allocates and handles all the required render targets for rendering a scene from a specific view.
  39. *
  40. * @note Core thread only.
  41. */
  42. class RenderTargets
  43. {
  44. public:
  45. /**
  46. * Prepares any internal data for rendering. Should be called at the beginning of each frame, before allocating,
  47. * retrieving or binding any textures. Must eventually be followed by cleanup().
  48. */
  49. void prepare();
  50. /**
  51. * Cleans up any internal data after rendering. Should be called after done rendering for a frame. All allocations
  52. * must be released at this point and no further allocations or texture binds should be done until the next call
  53. * to prepare().
  54. */
  55. void cleanup();
  56. /** Returns the depth buffer as a bindable texture. */
  57. SPtr<Texture> getSceneDepth() const;
  58. /**
  59. * Allocates the textures required for rendering. Allocations are pooled so this is generally a fast operation
  60. * unless the size or other render target options changed. This must be called before binding render targets.
  61. */
  62. void allocate(RenderTargetType type);
  63. /**
  64. * Deallocates textures by returning them to the pool. This should be done when the caller is done using the render
  65. * targets, so that other systems might re-use them. This will not release any memory unless all render targets
  66. * pointing to those textures go out of scope.
  67. */
  68. void release(RenderTargetType type);
  69. /** Binds the GBuffer render target for rendering. */
  70. void bindGBuffer();
  71. /** Returns the first color texture of the gbuffer as a bindable texture. */
  72. SPtr<Texture> getGBufferA() const;
  73. /** Returns the second color texture of the gbuffer as a bindable texture. */
  74. SPtr<Texture> getGBufferB() const;
  75. /** Returns the third color texture of the gbuffer as a bindable texture. */
  76. SPtr<Texture> getGBufferC() const;
  77. /**
  78. * Binds the scene color render target for rendering. If using MSAA this texture will be allocated as a texture
  79. * with multiple samples.
  80. */
  81. void bindSceneColor(bool readOnlyDepthStencil);
  82. /**
  83. * Binds the non-MSAA version of the scene color texture for rendering. If not using MSAA this is equivalent to
  84. * calling bindSceneColor() (as long as @p secondary is false).
  85. *
  86. * @param[in] secondary If true, a seconday scene color texture will be bound. This texture can be used
  87. * for ping-pong operations between it and the primary scene color.
  88. */
  89. void bindResolvedSceneColor(bool secondary = false);
  90. /** Binds the light accumulation render target for rendering. */
  91. void bindLightAccumulation();
  92. /**
  93. * Binds the light occlusion render target for rendering. Light occlusion texture and GBuffer must be allocated,
  94. * and depth must have been previously rendered to the depth buffer. Target is cleared before the method returns.
  95. */
  96. void bindLightOcclusion();
  97. /** Returns the texture containing (potentially multisampled) scene color. */
  98. SPtr<Texture> getSceneColor() const;
  99. /**
  100. * Flattened, buffer version of the texture returned by getSceneColor(). Only available when MSAA is used, since
  101. * random writes to multisampled textures aren't supported on all render backends.
  102. */
  103. SPtr<GpuBuffer> getSceneColorBuffer() const;
  104. /**
  105. * Returns a non-MSAA version of the scene color texture. If MSAA is not used this is equivalent to calling
  106. * getSceneColor() (as long as @p secondary is set to false).
  107. *
  108. * @param[in] secondary If true, a seconday scene color texture will be returned. This texture can be used
  109. * for ping-pong operations between it and the primary scene color.
  110. */
  111. SPtr<Texture> getResolvedSceneColor(bool secondary = false) const;
  112. /**
  113. * Returns a non-MSAA version of the scene color render target. If MSAA is not used this will return the default
  114. * scene color render target (as long as @p secondary is set to false).
  115. *
  116. * @param[in] secondary If true, a seconday scene color target will be returned. This target can be used
  117. * for ping-pong operations between it and the primary scene color.
  118. */
  119. SPtr<RenderTarget> getResolvedSceneColorRT(bool secondary = false) const;
  120. /** Returns the texture for storing of the intermediate lighting information. */
  121. SPtr<Texture> getLightAccumulation() const;
  122. /** Returns the texture for storing shadow/attenuation data for single light, from viewers perspective. */
  123. SPtr<Texture> getLightOcclusion() const;
  124. /**
  125. * Flattened, buffer version of the texture returned by getLightAccumulation(). Required when MSAA is used, since
  126. * random writes to multisampled textures aren't supported on all render backends.
  127. */
  128. SPtr<GpuBuffer> getLightAccumulationBuffer() const;
  129. /** Checks if the targets support HDR rendering. */
  130. bool getHDR() const { return mHDR; }
  131. /** Returns the number of samples per pixel supported by the targets. */
  132. UINT32 getNumSamples() const { return mViewTarget.numSamples; }
  133. /** Gets the width of the targets, in pixels. */
  134. UINT32 getWidth() const { return mWidth; }
  135. /** Gets the height of the targets, in pixels. */
  136. UINT32 getHeight() const { return mHeight; }
  137. /**
  138. * Creates a new set of render targets. Note in order to actually use the render targets you need to call the
  139. * relevant allocate* method before use.
  140. *
  141. * @param[in] view Information about the view that the render targets will be used for. Determines size
  142. * of the render targets, and the output color render target.
  143. * @param[in] hdr Should the render targets support high dynamic range rendering.
  144. */
  145. static SPtr<RenderTargets> create(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  146. private:
  147. RenderTargets(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  148. RENDERER_VIEW_TARGET_DESC mViewTarget;
  149. SPtr<PooledRenderTexture> mAlbedoTex;
  150. SPtr<PooledRenderTexture> mNormalTex;
  151. SPtr<PooledRenderTexture> mRoughMetalTex;
  152. SPtr<PooledRenderTexture> mDepthTex;
  153. SPtr<PooledRenderTexture> mLightAccumulationTex;
  154. SPtr<PooledRenderTexture> mLightOcclusionTex;
  155. SPtr<PooledStorageBuffer> mFlattenedLightAccumulationBuffer;
  156. SPtr<PooledRenderTexture> mSceneColorTex;
  157. SPtr<PooledStorageBuffer> mFlattenedSceneColorBuffer;
  158. SPtr<PooledRenderTexture> mResolvedSceneColorTex1;
  159. SPtr<PooledRenderTexture> mResolvedSceneColorTex2;
  160. SPtr<RenderTexture> mGBufferRT;
  161. SPtr<RenderTexture> mSceneColorRT;
  162. SPtr<RenderTexture> mResolvedSceneColorRT1;
  163. SPtr<RenderTexture> mResolvedSceneColorRT2;
  164. SPtr<RenderTexture> mLightAccumulationRT;
  165. SPtr<RenderTexture> mLightOcclusionRT;
  166. PixelFormat mSceneColorFormat;
  167. PixelFormat mAlbedoFormat;
  168. PixelFormat mNormalFormat;
  169. bool mHDR;
  170. UINT32 mWidth;
  171. UINT32 mHeight;
  172. };
  173. /** @} */
  174. }}