BsRenderTargets.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 final scene color information. */
  25. RTT_SceneColor
  26. };
  27. /**
  28. * Allocates and handles all the required render targets for rendering a scene from a specific view.
  29. *
  30. * @note Core thread only.
  31. */
  32. class RenderTargets
  33. {
  34. public:
  35. /**
  36. * Prepares any internal data for rendering. Should be called at the beginning of each frame, before allocating,
  37. * retrieving or binding any textures. Must eventually be followed by cleanup().
  38. */
  39. void prepare();
  40. /**
  41. * Cleans up any internal data after rendering. Should be called after done rendering for a frame. All allocations
  42. * must be released at this point and no further allocations or texture binds should be done until the next call
  43. * to prepare().
  44. */
  45. void cleanup();
  46. /** Returns the depth buffer as a bindable texture. */
  47. SPtr<Texture> getSceneDepth() const;
  48. /**
  49. * Allocates the textures required for rendering. Allocations are pooled so this is generally a fast operation
  50. * unless the size or other render target options changed. This must be called before binding render targets.
  51. */
  52. void allocate(RenderTargetType type);
  53. /**
  54. * Deallocates textures by returning them to the pool. This should be done when the caller is done using the render
  55. * targets, so that other systems might re-use them. This will not release any memory unless all render targets
  56. * pointing to those textures go out of scope.
  57. */
  58. void release(RenderTargetType type);
  59. /** Binds the GBuffer render target for rendering. */
  60. void bindGBuffer();
  61. /** Returns the first color texture of the gbuffer as a bindable texture. */
  62. SPtr<Texture> getGBufferA() const;
  63. /** Returns the second color texture of the gbuffer as a bindable texture. */
  64. SPtr<Texture> getGBufferB() const;
  65. /** Returns the third color texture of the gbuffer as a bindable texture. */
  66. SPtr<Texture> getGBufferC() const;
  67. /** Binds the scene color render target for rendering. */
  68. void bindSceneColor(bool readOnlyDepthStencil);
  69. /** Binds the light accumulation render target for rendering. */
  70. void bindLightAccumulation();
  71. /**
  72. * Binds the light occlusion render target for rendering. Light occlusion texture and GBuffer must be allocated,
  73. * and depth must have been previously rendered to the depth buffer. Target is cleared before the method returns.
  74. */
  75. void bindLightOcclusion();
  76. /**
  77. * Returns the texture for storing the final scene color. If using MSAA see getSceneColorBuffer() instead. Only
  78. * available after bindSceneColor() has been called from this frame.
  79. **/
  80. SPtr<Texture> getSceneColor() const;
  81. /**
  82. * Flattened, buffer version of the texture returned by getSceneColor(). Required when MSAA is used, since
  83. * random writes to multisampled textures aren't supported on all render backends.
  84. */
  85. SPtr<GpuBuffer> getSceneColorBuffer() const;
  86. /** Returns the texture for storing of the intermediate lighting information. */
  87. SPtr<Texture> getLightAccumulation() const;
  88. /** Returns the texture for storing shadow/attenuation data for single light, from viewers perspective. */
  89. SPtr<Texture> getLightOcclusion() const;
  90. /**
  91. * Flattened, buffer version of the texture returned by getLightAccumulation(). Required when MSAA is used, since
  92. * random writes to multisampled textures aren't supported on all render backends.
  93. */
  94. SPtr<GpuBuffer> getLightAccumulationBuffer() const;
  95. /**
  96. * Returns a scene color texture with a single-sample per pixel. If no multisampling is used, this is the same as
  97. * getSceneColor().
  98. */
  99. SPtr<Texture> getResolvedSceneColor() const;
  100. /** Returns a render target that can be used for rendering to the texture returned by getResolvedSceneColor(). */
  101. SPtr<RenderTexture> getResolvedSceneColorRT() const;
  102. /** Checks if the targets support HDR rendering. */
  103. bool getHDR() const { return mHDR; }
  104. /** Returns the number of samples per pixel supported by the targets. */
  105. UINT32 getNumSamples() const { return mViewTarget.numSamples; }
  106. /** Gets the width of the targets, in pixels. */
  107. UINT32 getWidth() const { return mWidth; }
  108. /** Gets the height of the targets, in pixels. */
  109. UINT32 getHeight() const { return mHeight; }
  110. /**
  111. * Creates a new set of render targets. Note in order to actually use the render targets you need to call the
  112. * relevant allocate* method before use.
  113. *
  114. * @param[in] view Information about the view that the render targets will be used for. Determines size
  115. * of the render targets, and the output color render target.
  116. * @param[in] hdr Should the render targets support high dynamic range rendering.
  117. */
  118. static SPtr<RenderTargets> create(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  119. private:
  120. RenderTargets(const RENDERER_VIEW_TARGET_DESC& view, bool hdr);
  121. RENDERER_VIEW_TARGET_DESC mViewTarget;
  122. SPtr<PooledRenderTexture> mAlbedoTex;
  123. SPtr<PooledRenderTexture> mNormalTex;
  124. SPtr<PooledRenderTexture> mRoughMetalTex;
  125. SPtr<PooledRenderTexture> mDepthTex;
  126. SPtr<PooledRenderTexture> mLightAccumulationTex;
  127. SPtr<PooledRenderTexture> mLightOcclusionTex;
  128. SPtr<PooledStorageBuffer> mFlattenedLightAccumulationBuffer;
  129. SPtr<PooledRenderTexture> mSceneColorTex;
  130. SPtr<PooledRenderTexture> mSceneColorNonMSAATex;
  131. SPtr<PooledStorageBuffer> mFlattenedSceneColorBuffer;
  132. SPtr<RenderTexture> mGBufferRT;
  133. SPtr<RenderTexture> mSceneColorRT;
  134. SPtr<RenderTexture> mLightAccumulationRT;
  135. SPtr<RenderTexture> mLightOcclusionRT;
  136. PixelFormat mSceneColorFormat;
  137. PixelFormat mAlbedoFormat;
  138. PixelFormat mNormalFormat;
  139. bool mHDR;
  140. UINT32 mWidth;
  141. UINT32 mHeight;
  142. };
  143. /** @} */
  144. }}