BsGLMultiRenderTexture.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGLMultiRenderTexture.h"
  4. #include "BsGLTexture.h"
  5. namespace BansheeEngine
  6. {
  7. GLMultiRenderTextureCore::GLMultiRenderTextureCore(const MULTI_RENDER_TEXTURE_CORE_DESC& desc)
  8. :MultiRenderTextureCore(desc), mProperties(desc), mFB(nullptr)
  9. { }
  10. GLMultiRenderTextureCore::~GLMultiRenderTextureCore()
  11. {
  12. if (mFB != nullptr)
  13. bs_delete(mFB);
  14. }
  15. void GLMultiRenderTextureCore::initialize()
  16. {
  17. MultiRenderTextureCore::initialize();
  18. if (mFB != nullptr)
  19. bs_delete(mFB);
  20. mFB = bs_new<GLFrameBufferObject>();
  21. for (size_t i = 0; i < mColorSurfaces.size(); i++)
  22. {
  23. if (mColorSurfaces[i] != nullptr)
  24. {
  25. GLTextureCore* glColorSurface = static_cast<GLTextureCore*>(mColorSurfaces[i]->getTexture().get());
  26. GLPixelBufferPtr colorBuffer = nullptr;
  27. GLSurfaceDesc surfaceDesc;
  28. if (glColorSurface->getProperties().getTextureType() != TEX_TYPE_3D)
  29. {
  30. surfaceDesc.zoffset = 0;
  31. colorBuffer = glColorSurface->getBuffer(mColorSurfaces[i]->getFirstArraySlice(),
  32. mColorSurfaces[i]->getMostDetailedMip());
  33. }
  34. else
  35. {
  36. surfaceDesc.zoffset = mColorSurfaces[i]->getFirstArraySlice();
  37. colorBuffer = glColorSurface->getBuffer(0, mColorSurfaces[i]->getMostDetailedMip());
  38. }
  39. surfaceDesc.numSamples = getProperties().getMultisampleCount();
  40. surfaceDesc.buffer = colorBuffer;
  41. mFB->bindSurface((UINT32)i, surfaceDesc);
  42. }
  43. else
  44. {
  45. mFB->unbindSurface((UINT32)i);
  46. }
  47. }
  48. if (mDepthStencilSurface != nullptr)
  49. {
  50. GLTextureCore* glDepthStencilSurface = static_cast<GLTextureCore*>(mDepthStencilSurface->getTexture().get());
  51. GLPixelBufferPtr depthStencilBuffer = nullptr;
  52. if (glDepthStencilSurface->getProperties().getTextureType() != TEX_TYPE_3D)
  53. {
  54. depthStencilBuffer = glDepthStencilSurface->getBuffer(mDepthStencilSurface->getDesc().firstArraySlice,
  55. mDepthStencilSurface->getDesc().mostDetailMip);
  56. }
  57. mFB->bindDepthStencil(depthStencilBuffer);
  58. }
  59. else
  60. {
  61. mFB->unbindDepthStencil();
  62. }
  63. }
  64. void GLMultiRenderTextureCore::getCustomAttribute(const String& name, void* pData) const
  65. {
  66. if(name=="FBO")
  67. {
  68. *static_cast<GLFrameBufferObject **>(pData) = mFB;
  69. }
  70. else if (name == "GL_FBOID" || name == "GL_MULTISAMPLEFBOID")
  71. {
  72. *static_cast<GLuint*>(pData) = mFB->getGLFBOID();
  73. }
  74. }
  75. GLMultiRenderTexture::GLMultiRenderTexture(const MULTI_RENDER_TEXTURE_DESC& desc)
  76. :MultiRenderTexture(desc), mProperties(desc)
  77. { }
  78. }