💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1396 lines
44 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. /*
  2. * Copyright (C) 2017 Christopher J. Howard
  3. *
  4. * This file is part of Antkeeper Source Code.
  5. *
  6. * Antkeeper Source Code is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Antkeeper Source Code is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "render-passes.hpp"
  20. #include "materials.hpp"
  21. #include <iostream>
  22. ShadowMapRenderPass::ShadowMapRenderPass():
  23. depthShader(nullptr)
  24. {
  25. modelViewProjectionParam = parameterSet.addParameter("modelViewProjection", ShaderParameter::Type::MATRIX_4, 1);
  26. }
  27. bool ShadowMapRenderPass::load(const RenderContext* renderContext)
  28. {
  29. depthShader = shaderLoader.load("data/shaders/depth-pass.glsl", &parameterSet);
  30. if (!depthShader)
  31. {
  32. return false;
  33. }
  34. return true;
  35. }
  36. void ShadowMapRenderPass::unload()
  37. {
  38. delete depthShader;
  39. depthShader = nullptr;
  40. }
  41. void ShadowMapRenderPass::render(const RenderContext* renderContext)
  42. {
  43. // Bind framebuffer and setup viewport
  44. glBindFramebuffer(GL_FRAMEBUFFER, renderTarget->framebuffer);
  45. glViewport(0, 0, renderTarget->width, renderTarget->height);
  46. // Clear the framebuffer depth
  47. glClearDepth(1.0);
  48. glClear(GL_DEPTH_BUFFER_BIT);
  49. // Enable depth testing
  50. glEnable(GL_DEPTH_TEST);
  51. glDepthMask(GL_TRUE);
  52. glDepthFunc(GL_LESS);
  53. // Enable backface culling
  54. glEnable(GL_CULL_FACE);
  55. glCullFace(GL_BACK);
  56. // Disable alpha blending
  57. glDisable(GL_BLEND);
  58. // Bind shader
  59. depthShader->bind();
  60. const Camera& camera = *(renderContext->camera);
  61. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  62. // Render operations
  63. for (const RenderOperation& operation: *operations)
  64. {
  65. // Skip render operations with unsupported materials
  66. if (operation.material->getMaterialFormatID() != static_cast<unsigned int>(MaterialFormat::PHYSICAL))
  67. {
  68. continue;
  69. }
  70. const PhysicalMaterial* material = static_cast<const PhysicalMaterial*>(operation.material);
  71. // Skip non shadow casters
  72. if (!material->shadowCaster)
  73. {
  74. continue;
  75. }
  76. const Matrix4& modelMatrix = operation.transform;
  77. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  78. depthShader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  79. glBindVertexArray(operation.vao);
  80. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  81. }
  82. }
  83. ClippingRenderPass::ClippingRenderPass():
  84. shader(nullptr)
  85. {
  86. clippingPlanesParam = parameterSet.addParameter("clippingPlanes", ShaderParameter::Type::VECTOR_4, 1);
  87. modelParam = parameterSet.addParameter("modelMatrix", ShaderParameter::Type::MATRIX_4, 1);
  88. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  89. }
  90. bool ClippingRenderPass::load(const RenderContext* renderContext)
  91. {
  92. shaderLoader.undefine();
  93. shaderLoader.define("CLIPPING_PLANE_COUNT", 1);
  94. shader = shaderLoader.load("data/shaders/clip.glsl", &parameterSet);
  95. if (!shader)
  96. {
  97. return false;
  98. }
  99. return true;
  100. }
  101. void ClippingRenderPass::unload()
  102. {
  103. delete shader;
  104. shader = nullptr;
  105. }
  106. void ClippingRenderPass::render(const RenderContext* renderContext)
  107. {
  108. glEnable(GL_CLIP_DISTANCE0);
  109. glEnable(GL_STENCIL_TEST);
  110. glDisable(GL_DEPTH_TEST);
  111. glDepthMask(GL_TRUE);
  112. glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  113. // Bind shader
  114. shader->bind();
  115. // Pass clipping planes to shader
  116. shader->setParameter(clippingPlanesParam, clippingPlane);
  117. // Grab render context parameters
  118. const Camera& camera = *(renderContext->camera);
  119. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  120. // Two passes
  121. for (int i = 0; i < 2; ++i)
  122. {
  123. if (!i)
  124. {
  125. // Increment stencil for back faces
  126. glStencilFunc(GL_ALWAYS, 0, 0);
  127. glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
  128. glCullFace(GL_FRONT);
  129. }
  130. else
  131. {
  132. // Decrement stencil for front faces
  133. glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
  134. glCullFace(GL_BACK);
  135. }
  136. for (const RenderOperation& operation: *operations)
  137. {
  138. const Matrix4& modelMatrix = operation.transform;
  139. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  140. shader->setParameter(modelParam, modelMatrix);
  141. shader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  142. glBindVertexArray(operation.vao);
  143. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  144. }
  145. }
  146. glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  147. glEnable(GL_DEPTH_TEST);
  148. glDepthMask(GL_TRUE);
  149. glDepthFunc(GL_LESS);
  150. glDisable(GL_CLIP_DISTANCE0);
  151. }
  152. void ClippingRenderPass::setClippingPlane(const Plane& plane)
  153. {
  154. this->clippingPlane = Vector4(plane.getNormal(), plane.getDistance());
  155. }
  156. SoilRenderPass::SoilRenderPass():
  157. shader(nullptr)
  158. {
  159. horizonTexturesParam = parameterSet.addParameter("horizonTextures", ShaderParameter::Type::INT, 4);
  160. modelParam = parameterSet.addParameter("modelMatrix", ShaderParameter::Type::MATRIX_4, 1);
  161. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  162. horizonOTexture = nullptr;
  163. horizonATexture = nullptr;
  164. horizonBTexture = nullptr;
  165. horizonCTexture = nullptr;
  166. }
  167. bool SoilRenderPass::load(const RenderContext* renderContext)
  168. {
  169. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  170. shaderLoader.define("VERTEX_TEXCOORD", EMERGENT_VERTEX_TEXCOORD);
  171. shaderLoader.define("VERTEX_NORMAL", EMERGENT_VERTEX_NORMAL);
  172. shader = shaderLoader.load("data/shaders/soil-profile.glsl", &parameterSet);
  173. if (!shader)
  174. {
  175. return false;
  176. }
  177. return true;
  178. }
  179. void SoilRenderPass::unload()
  180. {
  181. shaderLoader.undefine();
  182. delete shader;
  183. shader = nullptr;
  184. delete horizonOTexture;
  185. delete horizonATexture;
  186. delete horizonBTexture;
  187. delete horizonCTexture;
  188. horizonOTexture = nullptr;
  189. horizonATexture = nullptr;
  190. horizonBTexture = nullptr;
  191. horizonCTexture = nullptr;
  192. }
  193. void SoilRenderPass::render(const RenderContext* renderContext)
  194. {
  195. // Bind shader
  196. shader->bind();
  197. if (!horizonOTexture || !horizonATexture || !horizonBTexture || !horizonCTexture)
  198. {
  199. return;
  200. }
  201. // Bind textures
  202. glActiveTexture(GL_TEXTURE0);
  203. glBindTexture(GL_TEXTURE_2D, horizonOTexture->getTextureID());
  204. glActiveTexture(GL_TEXTURE1);
  205. glBindTexture(GL_TEXTURE_2D, horizonATexture->getTextureID());
  206. glActiveTexture(GL_TEXTURE2);
  207. glBindTexture(GL_TEXTURE_2D, horizonBTexture->getTextureID());
  208. glActiveTexture(GL_TEXTURE3);
  209. glBindTexture(GL_TEXTURE_2D, horizonCTexture->getTextureID());
  210. // Pass texture units to shader
  211. int textureUnits[] = {0, 1, 2, 3};
  212. shader->setParameter(horizonTexturesParam, 0, &textureUnits[0], 4);
  213. // Enable depth testing
  214. glEnable(GL_DEPTH_TEST);
  215. glDepthMask(GL_TRUE);
  216. glDepthFunc(GL_LEQUAL);
  217. // Enable backface culling
  218. glEnable(GL_CULL_FACE);
  219. glCullFace(GL_BACK);
  220. const Camera& camera = *(renderContext->camera);
  221. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  222. // Render operations
  223. for (const RenderOperation& operation: *operations)
  224. {
  225. // Skip render operations with unsupported materials
  226. if (operation.material->getMaterialFormatID() != static_cast<unsigned int>(MaterialFormat::PHYSICAL))
  227. {
  228. continue;
  229. }
  230. const PhysicalMaterial* material = static_cast<const PhysicalMaterial*>(operation.material);
  231. if (!(material->flags & (unsigned int)PhysicalMaterial::Flags::SOIL))
  232. {
  233. continue;
  234. }
  235. const Matrix4& modelMatrix = operation.transform;
  236. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  237. shader->setParameter(modelParam, modelMatrix);
  238. shader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  239. glBindVertexArray(operation.vao);
  240. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  241. }
  242. }
  243. LightingRenderPass::LightingRenderPass():
  244. shadowMap(0),
  245. shadowCamera(nullptr),
  246. treeShadow(nullptr),
  247. diffuseCubemap(nullptr)
  248. {
  249. // Initialize bias matrix for calculating the model-view-projection-bias matrix (used for shadow map texture coordinate calculation)
  250. biasMatrix = Matrix4(
  251. 0.5f, 0.0f, 0.0f, 0.0f,
  252. 0.0f, 0.5f, 0.0f, 0.0f,
  253. 0.0f, 0.0f, 0.5f, 0.0f,
  254. 0.5f, 0.5f, 0.5f, 1.0f);
  255. maxBoneCount = 64;
  256. matrixPaletteParam = parameterSet.addParameter("matrixPalette", ShaderParameter::Type::MATRIX_4, maxBoneCount);
  257. modelParam = parameterSet.addParameter("modelMatrix", ShaderParameter::Type::MATRIX_4, 1);
  258. modelViewParam = parameterSet.addParameter("modelViewMatrix", ShaderParameter::Type::MATRIX_4, 1);
  259. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  260. normalModelViewParam = parameterSet.addParameter("normalModelViewMatrix", ShaderParameter::Type::MATRIX_3, 1);
  261. normalModelParam = parameterSet.addParameter("normalModelMatrix", ShaderParameter::Type::MATRIX_3, 1);
  262. cameraPositionParam = parameterSet.addParameter("cameraPosition", ShaderParameter::Type::VECTOR_3, 1);
  263. directionalLightCountParam = parameterSet.addParameter("directionalLightCount", ShaderParameter::Type::INT, 1);
  264. directionalLightColorsParam = parameterSet.addParameter("directionalLightColors", ShaderParameter::Type::VECTOR_3, 1);
  265. directionalLightDirectionsParam = parameterSet.addParameter("directionalLightDirections", ShaderParameter::Type::VECTOR_3, 1);
  266. albedoOpacityMapParam = parameterSet.addParameter("albedoOpacityMap", ShaderParameter::Type::INT, 1);
  267. metalnessRoughnessMapParam = parameterSet.addParameter("metalnessRoughnessMap", ShaderParameter::Type::INT, 1);
  268. normalOcclusionMapParam = parameterSet.addParameter("normalOcclusionMap", ShaderParameter::Type::INT, 1);
  269. diffuseCubemapParam = parameterSet.addParameter("diffuseCubemap", ShaderParameter::Type::INT, 1);
  270. specularCubemapParam = parameterSet.addParameter("specularCubemap", ShaderParameter::Type::INT, 1);
  271. }
  272. bool LightingRenderPass::load(const RenderContext* renderContext)
  273. {
  274. // Load tree shadow
  275. TextureLoader textureLoader;
  276. treeShadow = textureLoader.load("data/textures/tree-shadow-0.png");
  277. if (!treeShadow)
  278. {
  279. std::cerr << "Failed to load tree shadow" << std::endl;
  280. }
  281. // Load cubemap
  282. textureLoader.setCubemap(true);
  283. textureLoader.setMipmapChain(false);
  284. diffuseCubemap = textureLoader.load("data/textures/campus-diffuse.png");
  285. if (!diffuseCubemap)
  286. {
  287. std::cerr << "Failed to load cubemap" << std::endl;
  288. }
  289. textureLoader.setCubemap(true);
  290. textureLoader.setMipmapChain(true);
  291. specularCubemap = textureLoader.load("data/textures/campus-specular_m%02d.png");
  292. if (!specularCubemap)
  293. {
  294. std::cerr << "Failed to load cubemap" << std::endl;
  295. }
  296. // Load unskinned shader
  297. shaderLoader.undefine();
  298. shaderLoader.define("TEXTURE_COUNT", 0);
  299. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  300. shaderLoader.define("VERTEX_NORMAL", EMERGENT_VERTEX_NORMAL);
  301. shaderLoader.define("VERTEX_TEXCOORD", EMERGENT_VERTEX_TEXCOORD);
  302. unskinnedShader = shaderLoader.load("data/shaders/lit-object.glsl", &parameterSet);
  303. // Load skinned shader
  304. shaderLoader.define("SKINNED");
  305. shaderLoader.define("MAX_BONE_COUNT", maxBoneCount);
  306. shaderLoader.define("VERTEX_BONE_INDICES", EMERGENT_VERTEX_BONE_INDICES);
  307. shaderLoader.define("VERTEX_BONE_WEIGHTS", EMERGENT_VERTEX_BONE_WEIGHTS);
  308. skinnedShader = shaderLoader.load("data/shaders/lit-object.glsl", &parameterSet);
  309. if (!unskinnedShader || !skinnedShader)
  310. {
  311. return false;
  312. }
  313. time = 0.0f;
  314. return true;
  315. }
  316. void LightingRenderPass::unload()
  317. {
  318. delete unskinnedShader;
  319. delete skinnedShader;
  320. unskinnedShader = nullptr;
  321. skinnedShader = nullptr;
  322. for (auto it = shaderCache.begin(); it != shaderCache.end(); ++it)
  323. {
  324. delete it->second;
  325. }
  326. shaderCache.clear();
  327. delete treeShadow;
  328. treeShadow = nullptr;
  329. delete diffuseCubemap;
  330. diffuseCubemap = nullptr;
  331. delete specularCubemap;
  332. specularCubemap = nullptr;
  333. }
  334. void LightingRenderPass::render(const RenderContext* renderContext)
  335. {
  336. /*
  337. time += 1.0f / 60.f;
  338. // Bind framebuffer and setup viewport
  339. glBindFramebuffer(GL_FRAMEBUFFER, renderTarget->framebuffer);
  340. glViewport(0, 0, renderTarget->width, renderTarget->height);
  341. // Clear the framebuffer depth
  342. //glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  343. //glClearDepth(1.0);
  344. //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  345. // Enable clipping
  346. if (renderContext->layer->getIndex() == 0)
  347. {
  348. // Clipping pass
  349. cappingRenderContext.camera = renderContext->camera;
  350. cappingRenderContext.layer = renderContext->layer;
  351. for (int i = 0; i < 5; ++i)
  352. {
  353. clippingRenderPass.setClippingPlane(clippingPlanes[i]);
  354. clippingRenderPass.render(renderContext);
  355. Transform transform = Transform::getIdentity();
  356. transform.translation = clippingPlanes[i].getNormal() * -clippingPlanes[i].getDistance();
  357. transform.scale = Vector3(150.0f);
  358. transform.rotation = glm::normalize(glm::rotation(Vector3(0, 0, -1), clippingPlanes[i].getNormal()));
  359. ModelInstance* cappingPlaneInstance = &cappingPlaneInstances[i];
  360. cappingPlaneInstance->setTransform(transform);
  361. cappingRenderQueue.clear();
  362. cappingRenderQueue.queue(cappingPlaneInstance);
  363. cappingRenderPass.render(&cappingRenderContext);
  364. }
  365. glEnable(GL_CLIP_DISTANCE0);
  366. }
  367. else
  368. {
  369. glDisable(GL_CLIP_DISTANCE0);
  370. }
  371. // Enable depth testing
  372. glEnable(GL_DEPTH_TEST);
  373. glDepthMask(GL_TRUE);
  374. glDepthFunc(GL_LEQUAL);
  375. // Enable backface culling
  376. glEnable(GL_CULL_FACE);
  377. glCullFace(GL_BACK);
  378. // Enable alpha blending
  379. glEnable(GL_BLEND);
  380. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  381. const Camera& camera = *(renderContext->camera);
  382. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  383. // Calculate camera direction
  384. const Vector3& cameraDirection = camera.getForward();
  385. // Textures
  386. const std::size_t maxTextures = 8;
  387. int materialTexture[maxTextures];
  388. Vector2 texcoordOffset[maxTextures];
  389. Vector2 texcoordScale[maxTextures];
  390. float textureDiffuseInfluence[maxTextures];
  391. float textureSpecularInfluence[maxTextures];
  392. float textureEmissiveInfluence[maxTextures];
  393. float textureRoughnessInfluence[maxTextures];
  394. float textureOpacityInfluence[maxTextures];
  395. float textureNormalInfluence[maxTextures];
  396. for (std::size_t i = 0; i < maxTextures; ++i)
  397. {
  398. materialTexture[i] = i + 2;
  399. }
  400. // Lights
  401. // Point lights
  402. const std::size_t maxPointLightCount = 4;
  403. std::size_t pointLightCount = 0;
  404. Vector3 pointLightColor[maxPointLightCount];
  405. Vector3 pointLightPosition[maxPointLightCount];
  406. Vector3 pointLightAttenuation[maxPointLightCount];
  407. for (std::size_t i = 0; i < maxPointLightCount; ++i)
  408. pointLightColor[i] = Vector3(0.0f);
  409. // Directional lights
  410. const std::size_t maxDirectionalLightCount = 4;
  411. std::size_t directionalLightCount = 0;
  412. Vector3 directionalLightColor[maxDirectionalLightCount];
  413. Vector3 directionalLightDirection[maxDirectionalLightCount];
  414. for (std::size_t i = 0; i < maxDirectionalLightCount; ++i)
  415. directionalLightColor[i] = Vector3(0.0f);
  416. // Spotlights
  417. const std::size_t maxSpotlightCount = 4;
  418. std::size_t spotlightCount = 0;
  419. Vector3 spotlightColor[maxSpotlightCount];
  420. Vector3 spotlightPosition[maxSpotlightCount];
  421. Vector3 spotlightAttenuation[maxSpotlightCount];
  422. Vector3 spotlightDirection[maxSpotlightCount];
  423. float spotlightCutoff[maxSpotlightCount];
  424. float spotlightExponent[maxSpotlightCount];
  425. for (std::size_t i = 0; i < maxSpotlightCount; ++i)
  426. spotlightColor[i] = Vector3(0.0f);
  427. const std::list<SceneObject*>* lights = renderContext->layer->getObjects(SceneObjectType::LIGHT);
  428. if (lights != nullptr)
  429. {
  430. for (auto object: *lights)
  431. {
  432. const Light* light = static_cast<const Light*>(object);
  433. LightType lightType = light->getLightType();
  434. if (lightType == LightType::POINT)
  435. {
  436. const PointLight* pointLight = static_cast<const PointLight*>(light);
  437. pointLightColor[pointLightCount] = pointLight->getScaledColor();
  438. pointLightPosition[pointLightCount] = Vector3(camera.getView() * Vector4(pointLight->getTranslation(), 1.0f));
  439. pointLightAttenuation[pointLightCount] = pointLight->getAttenuation();
  440. ++pointLightCount;
  441. }
  442. else if (lightType == LightType::DIRECTIONAL)
  443. {
  444. const DirectionalLight* directionalLight = static_cast<const DirectionalLight*>(light);
  445. directionalLightColor[directionalLightCount] = directionalLight->getScaledColor();
  446. directionalLightDirection[directionalLightCount] = glm::normalize(Vector3(camera.getView() * Vector4(-directionalLight->getDirection(), 0.0f)));
  447. ++directionalLightCount;
  448. }
  449. else if (lightType == LightType::SPOTLIGHT)
  450. {
  451. const Spotlight* spotlight = static_cast<const Spotlight*>(light);
  452. spotlightColor[spotlightCount] = spotlight->getScaledColor();
  453. spotlightPosition[spotlightCount] = Vector3(camera.getView() * Vector4(spotlight->getTranslation(), 1.0f));
  454. spotlightAttenuation[spotlightCount] = spotlight->getAttenuation();
  455. spotlightDirection[spotlightCount] = glm::normalize(Vector3(camera.getView() * Vector4(-spotlight->getDirection(), 0.0f)));
  456. spotlightCutoff[spotlightCount] = spotlight->getCutoff();
  457. spotlightExponent[spotlightCount] = spotlight->getExponent();
  458. ++spotlightCount;
  459. }
  460. }
  461. }
  462. // Calculate the (light-space) view-projection-bias matrix
  463. Matrix4 viewProjectionBiasMatrix = biasMatrix * shadowCamera->getViewProjection();
  464. // Bind shader
  465. Shader* boundShader = nullptr;
  466. // Bind shadow map
  467. glActiveTexture(GL_TEXTURE0);
  468. glBindTexture(GL_TEXTURE_2D, shadowMap);
  469. // Bind tree shadow
  470. glActiveTexture(GL_TEXTURE1);
  471. glBindTexture(GL_TEXTURE_2D, treeShadow.getTextureID());
  472. // For each clipping plane
  473. for (int clippingPlaneIndex = 0; clippingPlaneIndex < 5; ++clippingPlaneIndex)
  474. {
  475. // Render operations
  476. for (const RenderOperation& operation: *operations)
  477. {
  478. const Material* material = operation.material;
  479. // Find shader
  480. std::size_t hashValue = material->getHashValue();
  481. auto it = shaderCache.find(hashValue);
  482. if (it == shaderCache.end())
  483. {
  484. std::cerr << "Warning: material requires unloaded shader" << std::endl;
  485. continue;
  486. }
  487. // Bind shader
  488. Shader* shader = it->second;
  489. if (shader != boundShader)
  490. {
  491. shader->bind();
  492. boundShader = shader;
  493. }
  494. // Get shader parameters
  495. ShaderParameterSet* parameters = shader->getParameters();
  496. const Matrix4& modelMatrix = operation.transform;
  497. Matrix4 modelViewMatrix = camera.getView() * modelMatrix;
  498. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  499. // Pass matrix parameters
  500. if (parameters->hasParameter(ShaderParameter::MODEL_MATRIX))
  501. {
  502. parameters->setValue(ShaderParameter::MODEL_MATRIX, modelMatrix);
  503. }
  504. if (parameters->hasParameter(ShaderParameter::MODEL_VIEW_MATRIX))
  505. {
  506. parameters->setValue(ShaderParameter::MODEL_VIEW_MATRIX, modelViewMatrix);
  507. }
  508. if (parameters->hasParameter(ShaderParameter::MODEL_VIEW_PROJECTION_MATRIX))
  509. {
  510. parameters->setValue(ShaderParameter::MODEL_VIEW_PROJECTION_MATRIX, modelViewProjectionMatrix);
  511. }
  512. if (parameters->hasParameter(ShaderParameter::NORMAL_MODEL_MATRIX))
  513. {
  514. Matrix3 normalModelMatrix = glm::transpose(glm::inverse(Matrix3(modelMatrix)));
  515. parameters->setValue(ShaderParameter::NORMAL_MODEL_MATRIX, normalModelMatrix);
  516. }
  517. if (parameters->hasParameter(ShaderParameter::NORMAL_MODEL_VIEW_MATRIX))
  518. {
  519. Matrix3 normalModelViewMatrix = glm::transpose(glm::inverse(Matrix3(modelViewMatrix)));
  520. parameters->setValue(ShaderParameter::NORMAL_MODEL_VIEW_MATRIX, normalModelViewMatrix);
  521. }
  522. if (parameters->hasParameter(ShaderParameter::CAMERA_DIRECTION))
  523. {
  524. parameters->setValue(ShaderParameter::CAMERA_DIRECTION, cameraDirection);
  525. }
  526. // Pass material parameters
  527. if (parameters->hasParameter(ShaderParameter::MATERIAL_DIFFUSE_COLOR))
  528. {
  529. parameters->setValue(ShaderParameter::MATERIAL_DIFFUSE_COLOR, material->getDiffuseColor());
  530. }
  531. if (parameters->hasParameter(ShaderParameter::MATERIAL_SPECULAR_COLOR))
  532. {
  533. parameters->setValue(ShaderParameter::MATERIAL_SPECULAR_COLOR, material->getSpecularColor());
  534. }
  535. if (parameters->hasParameter(ShaderParameter::MATERIAL_EMISSIVE_COLOR))
  536. {
  537. parameters->setValue(ShaderParameter::MATERIAL_EMISSIVE_COLOR, material->getEmissiveColor());
  538. }
  539. if (parameters->hasParameter(ShaderParameter::MATERIAL_ROUGHNESS))
  540. {
  541. parameters->setValue(ShaderParameter::MATERIAL_ROUGHNESS, material->getRoughness());
  542. }
  543. if (parameters->hasParameter(ShaderParameter::MATERIAL_OPACITY))
  544. {
  545. parameters->setValue(ShaderParameter::MATERIAL_OPACITY, material->getOpacity());
  546. }
  547. // Pass texture parameters
  548. if (parameters->hasParameter(ShaderParameter::MATERIAL_TEXTURE))
  549. {
  550. std::size_t textureCount = material->getTextureCount();
  551. for (std::size_t i = 0; i < textureCount; ++i)
  552. {
  553. const Texture* texture = material->getTexture(i);
  554. texcoordOffset[i] = Vector2(texture->getCoordinateOffset());
  555. texcoordScale[i] = Vector2(texture->getCoordinateScale());
  556. textureDiffuseInfluence[i] = texture->getDiffuseInfluence();
  557. textureSpecularInfluence[i] = texture->getSpecularInfluence();
  558. textureEmissiveInfluence[i] = texture->getEmissiveInfluence();
  559. textureRoughnessInfluence[i] = texture->getRoughnessInfluence();
  560. textureOpacityInfluence[i] = texture->getOpacityInfluence();
  561. textureNormalInfluence[i] = texture->getNormalInfluence();
  562. // Bind texture
  563. glActiveTexture(GL_TEXTURE2 + i);
  564. glBindTexture(GL_TEXTURE_2D, texture->getTextureID());
  565. }
  566. parameters->setValue(ShaderParameter::MATERIAL_TEXTURE, 0, &materialTexture[0], textureCount);
  567. if (parameters->hasParameter(ShaderParameter::TEXCOORD_OFFSET))
  568. parameters->setValue(ShaderParameter::TEXCOORD_OFFSET, 0, &texcoordOffset[0], textureCount);
  569. if (parameters->hasParameter(ShaderParameter::TEXCOORD_SCALE))
  570. parameters->setValue(ShaderParameter::TEXCOORD_SCALE, 0, &texcoordScale[0], textureCount);
  571. if (parameters->hasParameter(ShaderParameter::TEXTURE_DIFFUSE_INFLUENCE))
  572. parameters->setValue(ShaderParameter::TEXTURE_DIFFUSE_INFLUENCE, 0, &textureDiffuseInfluence[0], textureCount);
  573. if (parameters->hasParameter(ShaderParameter::TEXTURE_SPECULAR_INFLUENCE))
  574. parameters->setValue(ShaderParameter::TEXTURE_SPECULAR_INFLUENCE, 0, &textureSpecularInfluence[0], textureCount);
  575. if (parameters->hasParameter(ShaderParameter::TEXTURE_EMISSIVE_INFLUENCE))
  576. parameters->setValue(ShaderParameter::TEXTURE_EMISSIVE_INFLUENCE, 0, &textureEmissiveInfluence[0], textureCount);
  577. if (parameters->hasParameter(ShaderParameter::TEXTURE_ROUGHNESS_INFLUENCE))
  578. parameters->setValue(ShaderParameter::TEXTURE_ROUGHNESS_INFLUENCE, 0, &textureRoughnessInfluence[0], textureCount);
  579. if (parameters->hasParameter(ShaderParameter::TEXTURE_OPACITY_INFLUENCE))
  580. parameters->setValue(ShaderParameter::TEXTURE_OPACITY_INFLUENCE, 0, &textureOpacityInfluence[0], textureCount);
  581. if (parameters->hasParameter(ShaderParameter::TEXTURE_NORMAL_INFLUENCE))
  582. parameters->setValue(ShaderParameter::TEXTURE_NORMAL_INFLUENCE, 0, &textureNormalInfluence[0], textureCount);
  583. }
  584. // Pass lighting parameters
  585. if (parameters->hasParameter(ShaderParameter::POINT_LIGHT_COLOR))
  586. {
  587. parameters->setValue(ShaderParameter::POINT_LIGHT_COLOR, 0, &pointLightColor[0], spotlightCount);
  588. parameters->setValue(ShaderParameter::POINT_LIGHT_POSITION, 0, &pointLightPosition[0], spotlightCount);
  589. parameters->setValue(ShaderParameter::POINT_LIGHT_ATTENUATION, 0, &pointLightAttenuation[0], spotlightCount);
  590. }
  591. if (parameters->hasParameter(ShaderParameter::DIRECTIONAL_LIGHT_COLOR))
  592. {
  593. parameters->setValue(ShaderParameter::DIRECTIONAL_LIGHT_COLOR, 0, &directionalLightColor[0], directionalLightCount);
  594. parameters->setValue(ShaderParameter::DIRECTIONAL_LIGHT_DIRECTION, 0, &directionalLightDirection[0], directionalLightCount);
  595. }
  596. if (parameters->hasParameter(ShaderParameter::SPOTLIGHT_COLOR))
  597. {
  598. parameters->setValue(ShaderParameter::SPOTLIGHT_COLOR, 0, &spotlightColor[0], spotlightCount);
  599. parameters->setValue(ShaderParameter::SPOTLIGHT_POSITION, 0, &spotlightPosition[0], spotlightCount);
  600. parameters->setValue(ShaderParameter::SPOTLIGHT_ATTENUATION, 0, &spotlightAttenuation[0], spotlightCount);
  601. parameters->setValue(ShaderParameter::SPOTLIGHT_DIRECTION, 0, &spotlightDirection[0], spotlightCount);
  602. parameters->setValue(ShaderParameter::SPOTLIGHT_CUTOFF, 0, &spotlightCutoff[0], spotlightCount);
  603. parameters->setValue(ShaderParameter::SPOTLIGHT_EXPONENT, 0, &spotlightExponent[0], spotlightCount);
  604. }
  605. if (parameters->hasParameter(ShaderParameter::DIFFUSE_ENVIRONMENT_MAP))
  606. {
  607. parameters->setValue(ShaderParameter::DIFFUSE_ENVIRONMENT_MAP, 1);
  608. }
  609. if (parameters->hasParameter(ShaderParameter::SPECULAR_ENVIRONMENT_MAP))
  610. {
  611. parameters->setValue(ShaderParameter::SPECULAR_ENVIRONMENT_MAP, 2);
  612. }
  613. // Pass shadow parameters
  614. if (parameters->hasParameter(ShaderParameter::MODEL_VIEW_PROJECTION_BIAS_MATRIX))
  615. {
  616. Matrix4 modelViewProjectionBiasMatrix = viewProjectionBiasMatrix * modelMatrix;
  617. parameters->setValue(ShaderParameter::MODEL_VIEW_PROJECTION_BIAS_MATRIX, modelViewProjectionBiasMatrix);
  618. }
  619. if (parameters->hasParameter(ShaderParameter::SHADOW_MAP))
  620. {
  621. parameters->setValue(ShaderParameter::SHADOW_MAP, 0);
  622. }
  623. if (parameters->hasParameter(ShaderParameter::TREE_SHADOW))
  624. {
  625. parameters->setValue(ShaderParameter::TREE_SHADOW, 1);
  626. }
  627. if (parameters->hasParameter(ShaderParameter::TIME))
  628. {
  629. parameters->setValue(ShaderParameter::TIME, time);
  630. }
  631. // Pass clipping parameters
  632. if (parameters->hasParameter(ShaderParameter::CLIPPING_PLANES))
  633. {
  634. const Plane& clippingPlane = clippingPlanes[clippingPlaneIndex];
  635. parameters->setValue(ShaderParameter::CLIPPING_PLANES, Vector4(clippingPlane.getNormal(), clippingPlane.getDistance()));
  636. }
  637. // Draw geometry
  638. glBindVertexArray(operation.vao);
  639. if (!material->isOpaque())
  640. {
  641. //glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  642. //glBlendFunc(GL_ONE, GL_ONE);
  643. //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  644. //glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  645. //glDepthMask(GL_FALSE);
  646. glFrontFace(GL_CW);
  647. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  648. parameters->setValue(ShaderParameter::MATERIAL_DIFFUSE_COLOR, material->getDiffuseColor() * 0.05f);
  649. glFrontFace(GL_CCW);
  650. //glDepthMask(GL_TRUE);
  651. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  652. //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  653. }
  654. else
  655. {
  656. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  657. }
  658. }
  659. }
  660. // Disable clipping
  661. glDisable(GL_CLIP_DISTANCE0);
  662. */
  663. const Camera& camera = *(renderContext->camera);
  664. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  665. // Enable depth testing
  666. glEnable(GL_DEPTH_TEST);
  667. glDepthMask(GL_TRUE);
  668. glDepthFunc(GL_LEQUAL);
  669. // Enable backface culling
  670. glEnable(GL_CULL_FACE);
  671. glCullFace(GL_BACK);
  672. // Enable alpha blending
  673. glEnable(GL_BLEND);
  674. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  675. int directionalLightCount = 1;
  676. Vector3 directionalLightColors[3];
  677. Vector3 directionalLightDirections[3];
  678. directionalLightColors[0] = Vector3(1);
  679. directionalLightDirections[0] = glm::normalize(Vector3(camera.getView() * -Vector4(0, 0, -1, 0)));
  680. glActiveTexture(GL_TEXTURE3);
  681. glBindTexture(GL_TEXTURE_CUBE_MAP, diffuseCubemap->getTextureID());
  682. glActiveTexture(GL_TEXTURE4);
  683. glBindTexture(GL_TEXTURE_CUBE_MAP, specularCubemap->getTextureID());
  684. Shader* shader = nullptr;
  685. Texture* albedoOpacityMap = nullptr;
  686. Texture* metalnessRoughnessMap = nullptr;
  687. Texture* normalOcclusionMap = nullptr;
  688. // Render operations
  689. for (const RenderOperation& operation: *operations)
  690. {
  691. // Skip render operations with unsupported materials
  692. if (operation.material->getMaterialFormatID() != static_cast<unsigned int>(MaterialFormat::PHYSICAL))
  693. {
  694. continue;
  695. }
  696. const PhysicalMaterial* material = static_cast<const PhysicalMaterial*>(operation.material);
  697. if (!(material->flags & (unsigned int)PhysicalMaterial::Flags::OBJECT))
  698. {
  699. continue;
  700. }
  701. // Skip render operations with unsupported vertex formats
  702. // Select shader
  703. Shader* targetShader = nullptr;
  704. if (operation.pose != nullptr)
  705. {
  706. targetShader = skinnedShader;
  707. }
  708. else
  709. {
  710. targetShader = unskinnedShader;
  711. }
  712. // Switch shader if necessary
  713. if (shader != targetShader)
  714. {
  715. shader = targetShader;
  716. // Bind shader
  717. shader->bind();
  718. // Pass static params
  719. shader->setParameter(albedoOpacityMapParam, 0);
  720. shader->setParameter(metalnessRoughnessMapParam, 1);
  721. shader->setParameter(normalOcclusionMapParam, 2);
  722. shader->setParameter(diffuseCubemapParam, 3);
  723. shader->setParameter(specularCubemapParam, 4);
  724. shader->setParameter(directionalLightCountParam, directionalLightCount);
  725. shader->setParameter(directionalLightColorsParam, 0, &directionalLightColors[0], directionalLightCount);
  726. shader->setParameter(directionalLightDirectionsParam, 0, &directionalLightDirections[0], directionalLightCount);
  727. shader->setParameter(cameraPositionParam, camera.getTranslation());
  728. }
  729. // Pass matrix palette
  730. if (operation.pose != nullptr)
  731. {
  732. shader->setParameter(matrixPaletteParam, 0, operation.pose->getMatrixPalette(), operation.pose->getSkeleton()->getBoneCount());
  733. }
  734. // Bind albedo-opacity map
  735. if (material->albedoOpacityMap != albedoOpacityMap)
  736. {
  737. albedoOpacityMap = material->albedoOpacityMap;
  738. if (albedoOpacityMap != nullptr)
  739. {
  740. glActiveTexture(GL_TEXTURE0);
  741. glBindTexture(GL_TEXTURE_2D, albedoOpacityMap->getTextureID());
  742. }
  743. }
  744. // Bind metalness-roughness map
  745. if (material->metalnessRoughnessMap != metalnessRoughnessMap)
  746. {
  747. metalnessRoughnessMap = material->metalnessRoughnessMap;
  748. if (metalnessRoughnessMap != nullptr)
  749. {
  750. glActiveTexture(GL_TEXTURE1);
  751. glBindTexture(GL_TEXTURE_2D, metalnessRoughnessMap->getTextureID());
  752. }
  753. }
  754. // Bind normal-occlusion map
  755. if (material->normalOcclusionMap != normalOcclusionMap)
  756. {
  757. normalOcclusionMap = material->normalOcclusionMap;
  758. if (normalOcclusionMap != nullptr)
  759. {
  760. glActiveTexture(GL_TEXTURE2);
  761. glBindTexture(GL_TEXTURE_2D, normalOcclusionMap->getTextureID());
  762. }
  763. }
  764. const Matrix4& modelMatrix = operation.transform;
  765. Matrix4 modelViewMatrix = camera.getView() * modelMatrix;
  766. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  767. Matrix3 normalModelViewMatrix = glm::transpose(glm::inverse(Matrix3(modelViewMatrix)));
  768. Matrix3 normalModelMatrix = glm::transpose(glm::inverse(Matrix3(modelMatrix)));
  769. shader->setParameter(modelParam, modelMatrix);
  770. shader->setParameter(modelViewParam, modelViewMatrix);
  771. shader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  772. shader->setParameter(normalModelViewParam, normalModelViewMatrix);
  773. shader->setParameter(normalModelParam, normalModelMatrix);
  774. glBindVertexArray(operation.vao);
  775. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  776. }
  777. }
  778. bool LightingRenderPass::loadShader(const RenderOperation& operation)
  779. {
  780. /*
  781. const std::string shaderFilename = "data/shaders/main.glsl";
  782. // Get material and its hash value
  783. const Material* material = operation.material;
  784. std::size_t hashValue = material->getHashValue();
  785. // Check if shader has already been loaded
  786. auto it = shaderCache.find(hashValue);
  787. if (it != shaderCache.end())
  788. return true;
  789. // Define shader preprocessor macros
  790. // Undefine previous definitions
  791. shaderLoader.undefine();
  792. // Clipping
  793. shaderLoader.define("CLIPPING_PLANE_COUNT", 1);
  794. // Vertex format
  795. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  796. shaderLoader.define("VERTEX_NORMAL", EMERGENT_VERTEX_NORMAL);
  797. //shaderLoader.define("VERTEX_COLOR", EMERGENT_VERTEX_COLOR);
  798. // Lighting
  799. // Material
  800. if (material->isShadeless())
  801. {
  802. shaderLoader.define("SHADELESS");
  803. }
  804. else
  805. {
  806. // Lighting
  807. //shaderLoader.define("POINT_LIGHT_COUNT", 1);
  808. shaderLoader.define("DIRECTIONAL_LIGHT_COUNT", 2);
  809. //shaderLoader.define("SPOTLIGHT_COUNT", 2);
  810. //shaderLoader.define("ENVIRONMENT_MAP");
  811. }
  812. if (material->isShadowReceiver())
  813. shaderLoader.define("SHADOWED");
  814. // Final
  815. shaderLoader.define("GAMMA_CORRECT");
  816. // Load shader
  817. Shader* shader = shaderLoader.load(shaderFilename);
  818. if (!shader)
  819. {
  820. std::cerr << "Failed to load shader \"" << shaderFilename << "\"" << std::endl;
  821. return false;
  822. }
  823. // Store shader in cache
  824. shaderCache[hashValue] = shader;
  825. return true;
  826. */
  827. return false;
  828. }
  829. DebugRenderPass::DebugRenderPass()
  830. {
  831. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  832. }
  833. bool DebugRenderPass::load(const RenderContext* renderContext)
  834. {
  835. unlitSolidShader = shaderLoader.load("data/shaders/unlit-solid.glsl", &parameterSet);
  836. if (!unlitSolidShader)
  837. {
  838. return false;
  839. }
  840. const float aabbVertexData[] =
  841. {
  842. -0.5, -0.5, -0.5,
  843. 0.5, -0.5, -0.5,
  844. 0.5, 0.5, -0.5,
  845. -0.5, 0.5, -0.5,
  846. -0.5, -0.5, 0.5,
  847. 0.5, -0.5, 0.5,
  848. 0.5, 0.5, 0.5,
  849. -0.5, 0.5, 0.5,
  850. };
  851. const std::uint32_t aabbIndexData[] =
  852. {
  853. 0, 1, 1, 2, 2, 3, 3, 0,
  854. 4, 5, 5, 6, 6, 7, 7, 4,
  855. 0, 4, 1, 5, 2, 6, 3, 7
  856. };
  857. aabbVertexCount = 8;
  858. aabbIndexCount = 24;
  859. // Create AABB geometry
  860. glGenVertexArrays(1, &aabbVAO);
  861. glBindVertexArray(aabbVAO);
  862. glGenBuffers(1, &aabbVBO);
  863. glBindBuffer(GL_ARRAY_BUFFER, aabbVBO);
  864. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * aabbVertexCount, aabbVertexData, GL_STATIC_DRAW);
  865. glEnableVertexAttribArray(EMERGENT_VERTEX_POSITION);
  866. glVertexAttribPointer(EMERGENT_VERTEX_POSITION, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (char*)0 + 0*sizeof(float));
  867. glGenBuffers(1, &aabbIBO);
  868. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, aabbIBO);
  869. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(std::uint32_t) * aabbIndexCount, aabbIndexData, GL_STATIC_DRAW);
  870. return true;
  871. }
  872. void DebugRenderPass::unload()
  873. {
  874. delete unlitSolidShader;
  875. unlitSolidShader = nullptr;
  876. glDeleteBuffers(1, &aabbIBO);
  877. glDeleteBuffers(1, &aabbVBO);
  878. glDeleteVertexArrays(1, &aabbVAO);
  879. }
  880. void DebugRenderPass::render(const RenderContext* renderContext)
  881. {
  882. const Camera& camera = *(renderContext->camera);
  883. /*
  884. // Bind framebuffer and setup viewport
  885. glBindFramebuffer(GL_FRAMEBUFFER, renderTarget->framebuffer);
  886. glViewport(0, 0, renderTarget->width, renderTarget->height);
  887. // Clear the framebuffer depth
  888. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  889. glClearDepth(1.0);
  890. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  891. // Disable depth testing
  892. glEnable(GL_DEPTH_TEST);
  893. glDepthMask(GL_TRUE);
  894. glDepthFunc(GL_LESS);
  895. */
  896. // Disable backface culling
  897. glDisable(GL_CULL_FACE);
  898. // Disable alpha blending
  899. glDisable(GL_BLEND);
  900. // Bind unlit solid shader
  901. unlitSolidShader->bind();
  902. // Bind AABB geometry
  903. glBindVertexArray(aabbVAO);
  904. const std::list<SceneObject*>* objects = renderContext->layer->getObjects();
  905. for (auto object: *objects)
  906. {
  907. if (!camera.getCullingMask()->intersects(object->getBounds()))
  908. continue;
  909. const AABB& bounds = object->getBounds();
  910. const Vector3& min = bounds.getMin();
  911. const Vector3& max = bounds.getMax();
  912. Vector3 scale = max - min;
  913. Vector3 center = (min + max) * 0.5f;
  914. const Vector3& translation = center;
  915. Matrix4 modelMatrix = glm::translate(translation) * glm::scale(scale);
  916. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  917. unlitSolidShader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  918. glDrawElements(GL_LINES, aabbIndexCount, GL_UNSIGNED_INT, (void*)0);
  919. }
  920. }
  921. UIRenderPass::UIRenderPass()
  922. {
  923. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  924. textureParam = parameterSet.addParameter("tex", ShaderParameter::Type::INT, 1);
  925. texcoordOffsetParam = parameterSet.addParameter("texcoordOffset", ShaderParameter::Type::VECTOR_2, 1);
  926. texcoordScaleParam = parameterSet.addParameter("texcoordScale", ShaderParameter::Type::VECTOR_2, 1);
  927. }
  928. bool UIRenderPass::load(const RenderContext* renderContext)
  929. {
  930. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  931. shaderLoader.define("VERTEX_TEXCOORD", EMERGENT_VERTEX_TEXCOORD);
  932. shaderLoader.define("VERTEX_COLOR", EMERGENT_VERTEX_COLOR);
  933. shaderLoader.define("GAMMA_CORRECT");
  934. shaderLoader.define("TEXTURE_COUNT", 1);
  935. texturedUIShader = shaderLoader.load("data/shaders/ui.glsl", &parameterSet);
  936. shaderLoader.undefine();
  937. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  938. shaderLoader.define("VERTEX_COLOR", EMERGENT_VERTEX_COLOR);
  939. shaderLoader.define("GAMMA_CORRECT");
  940. untexturedUIShader = shaderLoader.load("data/shaders/ui.glsl", &parameterSet);
  941. if (!texturedUIShader || !untexturedUIShader)
  942. {
  943. return false;
  944. }
  945. return true;
  946. }
  947. void UIRenderPass::unload()
  948. {
  949. delete texturedUIShader;
  950. delete untexturedUIShader;
  951. texturedUIShader = nullptr;
  952. untexturedUIShader = nullptr;
  953. }
  954. void UIRenderPass::render(const RenderContext* renderContext)
  955. {
  956. const Camera& camera = *(renderContext->camera);
  957. // Bind framebuffer and setup viewport
  958. glBindFramebuffer(GL_FRAMEBUFFER, renderTarget->framebuffer);
  959. glViewport(0, 0, renderTarget->width, renderTarget->height);
  960. // Disable depth testing
  961. glDisable(GL_DEPTH_TEST);
  962. //glDepthMask(GL_FALSE);
  963. //glDepthFunc(GL_LESS);
  964. // Disable backface culling
  965. glEnable(GL_CULL_FACE);
  966. glCullFace(GL_BACK);
  967. // Enable alpha blending
  968. glEnable(GL_BLEND);
  969. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  970. glActiveTexture(GL_TEXTURE0);
  971. Shader* shader = nullptr;
  972. // Render operations
  973. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  974. for (const RenderOperation& operation: *operations)
  975. {
  976. // Skip render operations with unsupported materials
  977. if (operation.material->getMaterialFormatID() != static_cast<unsigned int>(MaterialFormat::UI))
  978. {
  979. continue;
  980. }
  981. const UIMaterial* material = static_cast<const UIMaterial*>(operation.material);
  982. if (material->texture != nullptr)
  983. {
  984. shader = texturedUIShader;
  985. shader->bind();
  986. shader->setParameter(textureParam, 0);
  987. shader->setParameter(texcoordOffsetParam, Vector2(0.0f));
  988. shader->setParameter(texcoordScaleParam, Vector2(1.0f));
  989. glBindTexture(GL_TEXTURE_2D, material->texture->getTextureID());
  990. }
  991. else
  992. {
  993. shader = untexturedUIShader;
  994. shader->bind();
  995. }
  996. const Matrix4& modelMatrix = operation.transform;
  997. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  998. // Pass matrix parameters
  999. shader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  1000. // Draw geometry
  1001. glBindVertexArray(operation.vao);
  1002. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  1003. }
  1004. }
  1005. VignetteRenderPass::VignetteRenderPass():
  1006. shader(nullptr)
  1007. {
  1008. bayerTextureParam = parameterSet.addParameter("bayerTexture", ShaderParameter::Type::INT, 1);
  1009. modelViewProjectionParam = parameterSet.addParameter("modelViewProjectionMatrix", ShaderParameter::Type::MATRIX_4, 1);
  1010. }
  1011. bool VignetteRenderPass::load(const RenderContext* renderContext)
  1012. {
  1013. shaderLoader.undefine();
  1014. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  1015. shaderLoader.define("VERTEX_COLOR", EMERGENT_VERTEX_COLOR);
  1016. shaderLoader.define("TEXTURE_COUNT", 1);
  1017. shader = shaderLoader.load("data/shaders/vignette.glsl", &parameterSet);
  1018. if (!shader)
  1019. {
  1020. return false;
  1021. }
  1022. /// @see http://www.anisopteragames.com/how-to-fix-color-banding-with-dithering/
  1023. static const char pattern[] =
  1024. {
  1025. 0, 32, 8, 40, 2, 34, 10, 42,
  1026. 48, 16, 56, 24, 50, 18, 58, 26,
  1027. 12, 44, 4, 36, 14, 46, 6, 38,
  1028. 60, 28, 52, 20, 62, 30, 54, 22,
  1029. 3, 35, 11, 43, 1, 33, 9, 41,
  1030. 51, 19, 59, 27, 49, 17, 57, 25,
  1031. 15, 47, 7, 39, 13, 45, 5, 37,
  1032. 63, 31, 55, 23, 61, 29, 53, 21
  1033. };
  1034. glGenTextures(1, &bayerTextureID);
  1035. glBindTexture(GL_TEXTURE_2D, bayerTextureID);
  1036. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  1037. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  1038. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  1039. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  1040. glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 8, 8, 0, GL_RED, GL_UNSIGNED_BYTE, pattern);
  1041. return true;
  1042. }
  1043. void VignetteRenderPass::unload()
  1044. {
  1045. delete shader;
  1046. shader = nullptr;
  1047. glDeleteTextures(1, &bayerTextureID);
  1048. }
  1049. void VignetteRenderPass::render(const RenderContext* renderContext)
  1050. {
  1051. glDisable(GL_DEPTH_TEST);
  1052. glDepthMask(GL_FALSE);
  1053. // Bind shader
  1054. shader->bind();
  1055. // Bind texture
  1056. glActiveTexture(GL_TEXTURE0);
  1057. glBindTexture(GL_TEXTURE_2D, bayerTextureID);
  1058. // Pass texture unit to shader
  1059. shader->setParameter(bayerTextureParam, 0);
  1060. const Camera& camera = *(renderContext->camera);
  1061. const std::list<RenderOperation>* operations = renderContext->queue->getOperations();
  1062. // Render operations
  1063. for (const RenderOperation& operation: *operations)
  1064. {
  1065. const Material* material = operation.material;
  1066. const Matrix4& modelMatrix = operation.transform;
  1067. Matrix4 modelViewProjectionMatrix = camera.getViewProjection() * modelMatrix;
  1068. shader->setParameter(modelViewProjectionParam, modelViewProjectionMatrix);
  1069. glBindVertexArray(operation.vao);
  1070. glDrawElementsBaseVertex(GL_TRIANGLES, operation.triangleCount * 3, GL_UNSIGNED_INT, (void*)0, operation.indexOffset);
  1071. }
  1072. }
  1073. SkyboxRenderPass::SkyboxRenderPass():
  1074. shader(nullptr),
  1075. cubemap(nullptr)
  1076. {
  1077. matrixParam = parameterSet.addParameter("matrix", ShaderParameter::Type::MATRIX_4, 1);
  1078. cubemapParam = parameterSet.addParameter("cubemap", ShaderParameter::Type::INT, 1);
  1079. }
  1080. bool SkyboxRenderPass::load(const RenderContext* renderContext)
  1081. {
  1082. shaderLoader.undefine();
  1083. shaderLoader.define("VERTEX_POSITION", EMERGENT_VERTEX_POSITION);
  1084. shader = shaderLoader.load("data/shaders/skybox.glsl", &parameterSet);
  1085. if (!shader)
  1086. {
  1087. return false;
  1088. }
  1089. const float quadVertexData[] =
  1090. {
  1091. -1.0f, 1.0f, 0.0f,
  1092. -1.0f, -1.0f, 0.0f,
  1093. 1.0f, -1.0f, 0.0f,
  1094. 1.0f, 1.0f, 0.0f
  1095. };
  1096. const std::uint32_t quadIndexData[] =
  1097. {
  1098. 0, 1, 3,
  1099. 3, 1, 2
  1100. };
  1101. quadVertexCount = 4;
  1102. quadIndexCount = 6;
  1103. // Create AABB geometry
  1104. glGenVertexArrays(1, &quadVAO);
  1105. glBindVertexArray(quadVAO);
  1106. glGenBuffers(1, &quadVBO);
  1107. glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
  1108. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * quadVertexCount, quadVertexData, GL_STATIC_DRAW);
  1109. glEnableVertexAttribArray(EMERGENT_VERTEX_POSITION);
  1110. glVertexAttribPointer(EMERGENT_VERTEX_POSITION, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (char*)0 + 0*sizeof(float));
  1111. glGenBuffers(1, &quadIBO);
  1112. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadIBO);
  1113. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(std::uint32_t) * quadIndexCount, quadIndexData, GL_STATIC_DRAW);
  1114. return true;
  1115. }
  1116. void SkyboxRenderPass::unload()
  1117. {
  1118. delete shader;
  1119. shader = nullptr;
  1120. glDeleteBuffers(1, &quadIBO);
  1121. glDeleteBuffers(1, &quadVBO);
  1122. glDeleteVertexArrays(1, &quadVAO);
  1123. }
  1124. void SkyboxRenderPass::render(const RenderContext* renderContext)
  1125. {
  1126. if (!cubemap)
  1127. {
  1128. return;
  1129. }
  1130. glDisable(GL_DEPTH_TEST);
  1131. glDepthMask(GL_FALSE);
  1132. //glDisable(GL_CULL_FACE);
  1133. //glCullFace(GL_BACK);
  1134. // Bind shader
  1135. shader->bind();
  1136. // Bind cubemap texture
  1137. glActiveTexture(GL_TEXTURE0);
  1138. glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap->getTextureID());
  1139. // Pass texture unit to shader
  1140. shader->setParameter(cubemapParam, 0);
  1141. // Calculate matrix
  1142. const Camera& camera = *(renderContext->camera);
  1143. Matrix4 modelView = Matrix4(Matrix3(camera.getView()));
  1144. Matrix4 matrix = glm::inverse(modelView) * glm::inverse(camera.getProjection());
  1145. // Pass matrix to shader
  1146. shader->setParameter(matrixParam, matrix);
  1147. // Render quad
  1148. glBindVertexArray(quadVAO);
  1149. glDrawElementsBaseVertex(GL_TRIANGLES, quadIndexCount, GL_UNSIGNED_INT, (void*)0, 0);
  1150. }