2
0

BsReflectionProbes.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsReflectionProbes.h"
  4. #include "BsTexture.h"
  5. #include "BsGpuParamsSet.h"
  6. #include "BsRendererCamera.h"
  7. #include "BsRendererUtility.h"
  8. namespace bs { namespace ct
  9. {
  10. ReflectionCubemapFilterParamDef gReflectionCubemapFilterDef;
  11. ReflectionCubemapFilterMat::ReflectionCubemapFilterMat()
  12. {
  13. mParamBuffer = gReflectionCubemapFilterDef.createBuffer();
  14. mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
  15. mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
  16. }
  17. void ReflectionCubemapFilterMat::_initDefines(ShaderDefines& defines)
  18. {
  19. // Do nothing
  20. }
  21. void ReflectionCubemapFilterMat::execute(const SPtr<Texture>& source, UINT32 face, const TextureSurface& surface,
  22. const SPtr<RenderTarget>& target)
  23. {
  24. mInputTexture.set(source, surface);
  25. gReflectionCubemapFilterDef.gCubeFace.set(mParamBuffer, face);
  26. RenderAPI& rapi = RenderAPI::instance();
  27. rapi.setRenderTarget(target);
  28. gRendererUtility().setPass(mMaterial);
  29. gRendererUtility().setPassParams(mParamsSet);
  30. gRendererUtility().drawScreenQuad();
  31. }
  32. const UINT32 ReflectionProbes::REFLECTION_CUBEMAP_SIZE = 256;
  33. void ReflectionProbes::filterCubemapForSpecular(const SPtr<Texture>& cubemap)
  34. {
  35. static ReflectionCubemapFilterMat filterMaterial;
  36. UINT32 numMips = cubemap->getProperties().getNumMipmaps();
  37. for (UINT32 mip = 1; mip < numMips; mip++)
  38. {
  39. for (UINT32 face = 0; face < 6; face++)
  40. {
  41. RENDER_TEXTURE_DESC cubeFaceRTDesc;
  42. cubeFaceRTDesc.colorSurfaces[0].texture = cubemap;
  43. cubeFaceRTDesc.colorSurfaces[0].face = face;
  44. cubeFaceRTDesc.colorSurfaces[0].numFaces = 1;
  45. cubeFaceRTDesc.colorSurfaces[0].mipLevel = mip;
  46. SPtr<RenderTarget> target = RenderTexture::create(cubeFaceRTDesc);
  47. UINT32 sourceMip = mip - 1;
  48. TextureSurface sourceSurface(sourceMip, 1, 0, 6);
  49. filterMaterial.execute(cubemap, face, sourceSurface, target);
  50. }
  51. }
  52. }
  53. }}