BsRenderTargets.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. * Buffer containing a hierarchical Z buffer. If passed to RenderTargets::generate() it will build
  38. * the hierarchical Z buffer from the current contents of the scene depth buffer. Generated buffer can be
  39. * accessed from getHiZ(). If using MSAA render targets, make sure to first generate the RTT_ResolvedDepth
  40. * target as HiZ can't be built from multisampled depth buffer.
  41. */
  42. RTT_HiZ,
  43. /**
  44. * Buffer containing the resolved (non-multisampled) depth buffer. If multisampling isn't used then this will be
  45. * the same buffer as the scene depth buffer. If passed to RenderTargets::generate() it will resolve
  46. * the scene depth buffer into the newly allocated buffer. Scene depth must be previously allocated and populated
  47. * with scene data.
  48. */
  49. RTT_ResolvedDepth,
  50. /** Buffer containing ambient occlusion. */
  51. RTT_AmbientOcclusion
  52. };
  53. /**
  54. * Allocates and handles all the required render targets for rendering a scene from a specific view.
  55. *
  56. * @note Core thread only.
  57. */
  58. class RenderTargets
  59. {
  60. public:
  61. /**
  62. * Prepares any internal data for rendering. Should be called at the beginning of each frame, before allocating,
  63. * retrieving or binding any textures. Must eventually be followed by cleanup().
  64. */
  65. void prepare();
  66. /**
  67. * Cleans up any internal data after rendering. Should be called after done rendering for a frame. All allocations
  68. * must be released at this point and no further allocations or texture binds should be done until the next call
  69. * to prepare().
  70. */
  71. void cleanup();
  72. /**
  73. * Allocates the textures required for rendering. Allocations are pooled so this is generally a fast operation
  74. * unless the size or other render target options changed. This must be called before binding render targets.
  75. * Some render target types are also automatically populated with data, in which case calling generate() instead
  76. * of allocate is a better option - see individual target descriptions for more details.
  77. */
  78. void allocate(RenderTargetType type);
  79. /**
  80. * Deallocates textures by returning them to the pool. This should be done when the caller is done using the render
  81. * targets, so that other systems might re-use them. This will not release any memory unless all render targets
  82. * pointing to those textures go out of scope.
  83. */
  84. void release(RenderTargetType type);
  85. /**
  86. * Binds the specified render target for rendering, and performs any clear operations as necessary.
  87. */
  88. void bind(RenderTargetType type, bool readOnlyDepthStencil = false);
  89. /**
  90. * Generates contents for the specified render target type. Target must first be allocated by calling allocate().
  91. * Note that not all target types can have their contents automatically generated, most are meant to be populated
  92. * by external code. And those that can usually have prerequisites. See individual target descriptions for more
  93. * details.
  94. */
  95. void generate(RenderTargetType type);
  96. /** Returns a bindable texture for a render target previously allocated using allocate().*/
  97. SPtr<Texture> get(RenderTargetType type, RenderSurfaceMaskBits surface = RT_COLOR0) const;
  98. /** Returns a render target previously allocated using allocate(). */
  99. SPtr<RenderTexture> getRT(RenderTargetType type) const;
  100. /**
  101. * Flattened, buffer version of the texture returned by get(RTT_SceneColor). Only available when MSAA is used, since
  102. * random writes to multisampled textures aren't supported on all render backends.
  103. */
  104. SPtr<GpuBuffer> getSceneColorBuffer() const;
  105. /**
  106. * Flattened, buffer version of the texture returned by get(RTT_LightAccumulation). Required when MSAA is used,
  107. * since random writes to multisampled textures aren't supported on all render backends.
  108. */
  109. SPtr<GpuBuffer> getLightAccumulationBuffer() const;
  110. /** Checks if the targets support HDR rendering. */
  111. bool getHDR() const { return mHDR; }
  112. /** Returns the number of samples per pixel supported by the targets. */
  113. UINT32 getNumSamples() const { return mViewTarget.numSamples; }
  114. /** Gets the width of the targets, in pixels. */
  115. UINT32 getWidth() const { return mWidth; }
  116. /** Gets the height of the targets, in pixels. */
  117. UINT32 getHeight() const { return mHeight; }
  118. /**
  119. * Creates a new set of render targets. Note in order to actually use the render targets you need to call the
  120. * relevant allocate* method before use.
  121. *
  122. * @param[in] view Information about the view that the render targets will be used for. Determines size
  123. * of the render targets, and the output color render target.
  124. * @param[in] hdr Should the render targets support high dynamic range rendering.
  125. */
  126. static SPtr<RenderTargets> create(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  127. private:
  128. RenderTargets(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  129. /** Returns a pooled texture previously allocated with a call to allocate(). */
  130. SPtr<PooledRenderTexture> getPooledTexture(RenderTargetType type, RenderSurfaceMaskBits surface = RT_COLOR0) const;
  131. RENDERER_VIEW_TARGET_DESC mViewTarget;
  132. SPtr<PooledRenderTexture> mAlbedoTex;
  133. SPtr<PooledRenderTexture> mNormalTex;
  134. SPtr<PooledRenderTexture> mRoughMetalTex;
  135. SPtr<PooledRenderTexture> mDepthTex;
  136. SPtr<PooledRenderTexture> mLightAccumulationTex;
  137. SPtr<PooledRenderTexture> mLightOcclusionTex;
  138. SPtr<PooledStorageBuffer> mFlattenedLightAccumulationBuffer;
  139. SPtr<PooledRenderTexture> mSceneColorTex;
  140. SPtr<PooledStorageBuffer> mFlattenedSceneColorBuffer;
  141. SPtr<PooledRenderTexture> mResolvedSceneColorTex1;
  142. SPtr<PooledRenderTexture> mResolvedSceneColorTex2;
  143. SPtr<PooledRenderTexture> mHiZ;
  144. SPtr<PooledRenderTexture> mResolvedDepthTex;
  145. SPtr<PooledRenderTexture> mAmbientOcclusionTex;
  146. SPtr<RenderTexture> mGBufferRT;
  147. SPtr<RenderTexture> mSceneColorRT;
  148. SPtr<RenderTexture> mLightAccumulationRT;
  149. SPtr<RenderTexture> mLightOcclusionRT;
  150. PixelFormat mSceneColorFormat;
  151. PixelFormat mAlbedoFormat;
  152. PixelFormat mNormalFormat;
  153. bool mHDR;
  154. UINT32 mWidth;
  155. UINT32 mHeight;
  156. // Note: Only a single instance of this is needed, move it to a Module eventually
  157. BuildHiZ mBuildHiZ;
  158. };
  159. /** @} */
  160. }}