ShaderUniformUpdater.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "ErrorHandlerLocator.h"
  2. #include "ShaderUniforms.h"
  3. #include "ShaderUniformUpdater.h"
  4. const UniformObjectData ShaderUniformUpdater::m_defaultObjectData;
  5. const UniformFrameData ShaderUniformUpdater::m_defaultFrameData;
  6. const UniformData ShaderUniformUpdater::m_defaultUniformData = UniformData(ShaderUniformUpdater::m_defaultObjectData, ShaderUniformUpdater::m_defaultFrameData);
  7. ErrorCode ShaderUniformUpdater::generateUpdateList()
  8. {
  9. ErrorCode returnError = ErrorCode::Success;
  10. // Make sure shader handle is up to date
  11. m_shaderHandle = m_shader.getShaderHandle();
  12. returnError = generateTextureUpdateList();
  13. returnError = generatePerFrameList();
  14. returnError = generatePerModelList();
  15. returnError = generatePerMeshList();
  16. returnError = generateUniformBlockList();
  17. returnError = generateSSBBlockList();
  18. m_numUpdatesPerFrame = m_updatesPerFrame.size();
  19. m_numUpdatesPerModel = m_updatesPerModel.size();
  20. m_numUpdatesPerMesh = m_updatesPerMesh.size();
  21. m_numTextureUpdates = m_textureUpdates.size();
  22. m_numUniformBlockUpdates = m_uniformBlockUpdates.size();
  23. m_numSSBBBlockUpdates = m_SSBBlockUpdates.size();
  24. // Check for errors, and cache it if it exists, since we are returning the error to higher layer
  25. if(returnError != ErrorCode::Success)
  26. ErrHandlerLoc::get().log(returnError, ErrorSource::Source_ShaderLoader, m_shader.getCombinedFilename());
  27. return returnError;
  28. }
  29. ErrorCode ShaderUniformUpdater::generateTextureUpdateList()
  30. {
  31. ErrorCode returnError = ErrorCode::Success;
  32. // Make a vector of uniform classes and populate it
  33. std::vector<BaseUniform*> uniformList;
  34. // Framebuffer texture uniforms
  35. uniformList.push_back(new PositionMapUniform(m_shaderHandle));
  36. uniformList.push_back(new DiffuseMapUniform(m_shaderHandle));
  37. uniformList.push_back(new NormalMapUniform(m_shaderHandle));
  38. uniformList.push_back(new EmissiveMapUniform(m_shaderHandle));
  39. uniformList.push_back(new MatPropertiesMapUniform(m_shaderHandle));
  40. uniformList.push_back(new IntermediateMapUniform(m_shaderHandle));
  41. uniformList.push_back(new FinalMapUniform(m_shaderHandle));
  42. uniformList.push_back(new InputMapUniform(m_shaderHandle));
  43. uniformList.push_back(new OutputMapUniform(m_shaderHandle));
  44. // Cubemap texture uniforms
  45. uniformList.push_back(new DynamicEnvironmentMapUniform(m_shaderHandle));
  46. uniformList.push_back(new StaticEnvironmentMapUniform(m_shaderHandle));
  47. // Skydome texture uniforms
  48. uniformList.push_back(new SunGlowTextureUniform(m_shaderHandle));
  49. uniformList.push_back(new SkyMapTextureUniform(m_shaderHandle));
  50. // Shadow map depth texture uniforms
  51. uniformList.push_back(new DirShadowMapTextureUniform(m_shaderHandle));
  52. // Geometry pass textures
  53. uniformList.push_back(new DiffuseTextureUniform(m_shaderHandle));
  54. uniformList.push_back(new NormalTextureUniform(m_shaderHandle));
  55. uniformList.push_back(new EmissiveTextureUniform(m_shaderHandle));
  56. uniformList.push_back(new CombinedTextureUniform(m_shaderHandle));
  57. // Atmoshperic scattering textures
  58. uniformList.push_back(new AtmIrradianceTextureUniform(m_shaderHandle));
  59. uniformList.push_back(new AtmScatteringTextureUniform(m_shaderHandle));
  60. uniformList.push_back(new AtmSingleMieTextureUniform(m_shaderHandle));
  61. uniformList.push_back(new AtmTransmittanceTextureUniform(m_shaderHandle));
  62. // Lens flare effect textures
  63. uniformList.push_back(new LensFlareDirtTextureUniform(m_shaderHandle));
  64. uniformList.push_back(new LensFlareGhostGradientTextureUniform(m_shaderHandle));
  65. uniformList.push_back(new LensFlareStarburstTextureUniform(m_shaderHandle));
  66. // Go through each uniform and check if it is valid
  67. // If it is, add it to the update list, if not, delete it
  68. for(decltype(uniformList.size()) i = 0, size = uniformList.size(); i < size; i++)
  69. if(uniformList[i]->isValid())
  70. m_textureUpdates.push_back(uniformList[i]);
  71. else
  72. delete uniformList[i];
  73. return returnError;
  74. }
  75. ErrorCode ShaderUniformUpdater::generatePerFrameList()
  76. {
  77. ErrorCode returnError = ErrorCode::Success;
  78. // Make a vector of uniform classes and populate it
  79. std::vector<BaseUniform*> uniformList;
  80. // View, Projection matrices
  81. uniformList.push_back(new AtmScatProjMatUniform(m_shaderHandle));
  82. uniformList.push_back(new ViewMatUniform(m_shaderHandle));
  83. uniformList.push_back(new ProjectionMatUniform(m_shaderHandle));
  84. uniformList.push_back(new ViewProjectionMatUniform(m_shaderHandle));
  85. uniformList.push_back(new TransposeViewMatUniform(m_shaderHandle));
  86. uniformList.push_back(new DirShadowMapMVPUniform(m_shaderHandle));
  87. uniformList.push_back(new DirShadowMapBiasMVPUniform(m_shaderHandle));
  88. // Camera uniforms
  89. uniformList.push_back(new CameraPosVecUniform(m_shaderHandle));
  90. uniformList.push_back(new CameraTargetVecUniform(m_shaderHandle));
  91. // Distance based fog uniforms
  92. uniformList.push_back(new FogDensityUniform(m_shaderHandle));
  93. uniformList.push_back(new FogColorUniform(m_shaderHandle));
  94. // Directional light
  95. uniformList.push_back(new DirLightColorUniform(m_shaderHandle));
  96. uniformList.push_back(new DirLightDirectionUniform(m_shaderHandle));
  97. uniformList.push_back(new DirLightIntensityUniform(m_shaderHandle));
  98. // Number of lights
  99. uniformList.push_back(new NumPointLightsUniform(m_shaderHandle));
  100. uniformList.push_back(new NumSpotLightsUniform(m_shaderHandle));
  101. // Screen size uniform
  102. uniformList.push_back(new ScreenSizeUniform(m_shaderHandle));
  103. // Misc
  104. uniformList.push_back(new DeltaTimeMSUniform(m_shaderHandle));
  105. uniformList.push_back(new DeltaTimeSUniform(m_shaderHandle));
  106. uniformList.push_back(new ElapsedTimeUniform(m_shaderHandle));
  107. uniformList.push_back(new GammaUniform(m_shaderHandle));
  108. uniformList.push_back(new EyeAdaptionRateUniform(m_shaderHandle));
  109. uniformList.push_back(new EyeAdaptionIntendedBrightnessUniform(m_shaderHandle));
  110. uniformList.push_back(new EmissiveMultiplierUniform(m_shaderHandle));
  111. uniformList.push_back(new LODParallaxMappingUniform(m_shaderHandle));
  112. // Go through each uniform and check if it is valid
  113. // If it is, add it to the update list, if not, delete it
  114. for(decltype(uniformList.size()) i = 0, size = uniformList.size(); i < size; i++)
  115. if(uniformList[i]->isValid())
  116. m_updatesPerFrame.push_back(uniformList[i]);
  117. else
  118. delete uniformList[i];
  119. return returnError;
  120. }
  121. ErrorCode ShaderUniformUpdater::generatePerModelList()
  122. {
  123. ErrorCode returnError = ErrorCode::Success;
  124. // Make a vector of uniform classes and populate it
  125. std::vector<BaseUniform*> uniformList;
  126. // Model matrices
  127. uniformList.push_back(new ModelMatUniform(m_shaderHandle));
  128. uniformList.push_back(new ModelViewMatUniform(m_shaderHandle));
  129. uniformList.push_back(new ModelViewProjectionMatUniform(m_shaderHandle));
  130. // Billboard uniforms
  131. uniformList.push_back(new BillboardScaleUniform(m_shaderHandle));
  132. uniformList.push_back(new DepthTypeUniform(m_shaderHandle));
  133. // Miscellaneous
  134. uniformList.push_back(new AlphaCullingUniform(m_shaderHandle));
  135. uniformList.push_back(new AlphaThresholdUniform(m_shaderHandle));
  136. uniformList.push_back(new EmissiveThresholdUniform(m_shaderHandle));
  137. uniformList.push_back(new HeightScaleUniform(m_shaderHandle));
  138. uniformList.push_back(new TextureTilingFactorUniform(m_shaderHandle));
  139. // Test uniforms, used for debugging, etc
  140. uniformList.push_back(new TestMatUniform(m_shaderHandle));
  141. uniformList.push_back(new TestVecUniform(m_shaderHandle));
  142. uniformList.push_back(new TestFloatUniform(m_shaderHandle));
  143. // Go through each uniform and check if it is valid
  144. // If it is, add it to the update list, if not, delete it
  145. for(decltype(uniformList.size()) i = 0, size = uniformList.size(); i < size; i++)
  146. if(uniformList[i]->isValid())
  147. m_updatesPerModel.push_back(uniformList[i]);
  148. else
  149. delete uniformList[i];
  150. return returnError;
  151. }
  152. ErrorCode ShaderUniformUpdater::generatePerMeshList()
  153. {
  154. return ErrorCode::Success;
  155. }
  156. ErrorCode ShaderUniformUpdater::generateUniformBlockList()
  157. {
  158. ErrorCode returnError = ErrorCode::Success;
  159. // Make a vector of uniform classes and populate it
  160. std::vector<BaseUniformBlock*> uniformBlockList;
  161. // Light buffers
  162. uniformBlockList.push_back(new PointLightBufferUniform(m_shaderHandle));
  163. uniformBlockList.push_back(new SpotLightBufferUniform(m_shaderHandle));
  164. // Atmospheric scattering buffer
  165. uniformBlockList.push_back(new AtmScatParametersUniform(m_shaderHandle));
  166. // Lens flare effect parameters buffer
  167. uniformBlockList.push_back(new LensFlareParametersUniform(m_shaderHandle));
  168. // Go through each uniform and check if it is valid
  169. // If it is, add it to the update list, if not, delete it
  170. for(decltype(uniformBlockList.size()) i = 0, size = uniformBlockList.size(); i < size; i++)
  171. if(uniformBlockList[i]->isValid())
  172. m_uniformBlockUpdates.push_back(uniformBlockList[i]);
  173. else
  174. delete uniformBlockList[i];
  175. return returnError;
  176. }
  177. ErrorCode ShaderUniformUpdater::generateSSBBlockList()
  178. {
  179. ErrorCode returnError = ErrorCode::Success;
  180. // Make a vector of SSBO classes and populate it
  181. std::vector<BaseShaderStorageBlock*> SSBBlockList;
  182. // HDR SSBO
  183. SSBBlockList.push_back(new HDRShaderStorageBuffer(m_shaderHandle));
  184. // Go through each uniform and check if it is valid
  185. // If it is, add it to the update list, if not, delete it
  186. for(decltype(SSBBlockList.size()) i = 0, size = SSBBlockList.size(); i < size; i++)
  187. if(SSBBlockList[i]->isValid())
  188. m_SSBBlockUpdates.push_back(SSBBlockList[i]);
  189. else
  190. delete SSBBlockList[i];
  191. return returnError;
  192. }