BsGLMultiRenderTexture.cpp 2.4 KB

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