Is.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "anki/renderer/Is.h"
  2. #include "anki/renderer/Renderer.h"
  3. #define BLEND_ENABLE true
  4. namespace anki {
  5. /// Representation of the program's block
  6. struct UniformBlockData
  7. {
  8. vec2 planes;
  9. vec2 limitsOfNearPlane;
  10. vec2 limitsOfNearPlane2;
  11. float zNear; float padding0;
  12. float lightRadius; float padding1;
  13. float shadowMapSize; float padding2;
  14. vec3 lightPos; float padding3;
  15. vec3 lightDiffuseCol; float padding4;
  16. vec3 lightSpecularCol; float padding5;
  17. mat4 texProjectionMat;
  18. };
  19. //==============================================================================
  20. Is::Is(Renderer* r_)
  21. : RenderingPass(r_)
  22. {}
  23. //==============================================================================
  24. Is::~Is()
  25. {}
  26. //==============================================================================
  27. void Is::init(const RendererInitializer& /*initializer*/)
  28. {
  29. try
  30. {
  31. // Load the passes
  32. //
  33. // XXX
  34. // Load the programs
  35. //
  36. // Ambient pass
  37. ambientPassSProg.load("shaders/IsAp.glsl");
  38. // point light
  39. pointLightSProg.load(ShaderProgramResource::createSrcCodeToCache(
  40. "shaders/IsLpGeneric.glsl", "#define POINT_LIGHT 1\n").c_str());
  41. // spot light no shadow
  42. spotLightNoShadowSProg.load(
  43. ShaderProgramResource::createSrcCodeToCache(
  44. "shaders/IsLpGeneric.glsl", "#define SPOT_LIGHT 1\n").c_str());
  45. // spot light w/t shadow
  46. std::string pps = std::string("#define SPOT_LIGHT 1\n"
  47. "#define SHADOW 1\n");
  48. if(/*sm.isPcfEnabled()*/ 1) // XXX
  49. {
  50. pps += "#define PCF 1\n";
  51. }
  52. spotLightShadowSProg.load(ShaderProgramResource::createSrcCodeToCache(
  53. "shaders/IsLpGeneric.glsl", pps.c_str()).c_str());
  54. // Create FBO
  55. //
  56. fbo.create();
  57. fbo.setColorAttachments({fai});
  58. if(!fbo.isComplete())
  59. {
  60. throw ANKI_EXCEPTION("Fbo not complete");
  61. }
  62. // Create UBO
  63. //
  64. const ShaderProgramUniformBlock& block =
  65. pointLightSProg->findUniformBlock("uniforms");
  66. if(block.getSize() != sizeof(UniformBlockData))
  67. {
  68. throw ANKI_EXCEPTION("Uniform block size is not the expected");
  69. }
  70. ubo.create(GL_UNIFORM_BUFFER, blockSize, nullptr, GL_STATIC_DRAW);
  71. ubo.setBinding(0);
  72. }
  73. catch(const std::exception& e)
  74. {
  75. throw ANKI_EXCEPTION("Failed to create IS stage") << e;
  76. }
  77. }
  78. //==============================================================================
  79. void Is::pointLightPass(PointLight& light)
  80. {
  81. const Camera& cam = r.getCamera();
  82. // XXX SMO
  83. GlStateSingleton::get().enable(GL_DEPTH_TEST, false);
  84. // shader prog
  85. const ShaderProgram& shader = *pointLightSProg; // ensure the const-ness
  86. shader.bind();
  87. shader.findUniformVariableByName("msFai0")->set(r->getMs().getFai0());
  88. shader.findUniformVariableByName("msDepthFai")->set(
  89. r->getMs().getDepthFai());
  90. UniformBlockData data;
  91. data.planes = r->getPlanes();
  92. data.limitsOfNearPlane = r->.getLimitsOfNearPlane();
  93. data.limitsOfNearPlane2 = r->getLimitsOfNearPlane();
  94. data.zNear = cam.getZNear();
  95. Vec3 lightPosEyeSpace = origin.getTransformed(cam.getViewMatrix());
  96. data.lightPos = lightPosEyeSpace;
  97. data.lightRadius = light.getRadius();
  98. data.lightDiffuseCol = light.getDiffuseColor();
  99. data.lightSpecularCol = light.getSpecularColor();
  100. ubo.write(&data, 0, sizeof(UniformBlockData));
  101. // render quad
  102. r->drawQuad();
  103. }
  104. //==============================================================================
  105. void Is::run()
  106. {
  107. /// TODO
  108. }
  109. } // end namespace anki