Advertisement
Guest User

Untitled

a guest
May 7th, 2025
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.09 KB | None | 0 0
  1. // before render loop
  2. const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;
  3. unsigned int depthMapFBO;
  4. glGenFramebuffers(1, &depthMapFBO);
  5. // create depth cubemap texture
  6. unsigned int depthCubemap;
  7. glGenTextures(1, &depthCubemap);
  8. glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap);
  9. for (unsigned int i = 0; i < 6; ++i)
  10. glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
  11. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  12. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  13. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  14. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  15. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  16. // attach depth texture as FBO's depth buffer
  17. glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
  18. glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthCubemap, 0);
  19. glDrawBuffer(GL_NONE);
  20. glReadBuffer(GL_NONE);
  21. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  22.  
  23. glm::vec3 lightPos = {2, 2, 2};
  24.  
  25. // inside update loop
  26. float near_plane = 1.0f;
  27. float far_plane = 25.0f;
  28. glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), (float)SHADOW_WIDTH / (float)SHADOW_HEIGHT, near_plane, far_plane);
  29. std::vector<glm::mat4> shadowTransforms;
  30. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)));
  31. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)));
  32. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)));
  33. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3( 0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)));
  34. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)));
  35. shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3( 0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f)));
  36. config::pointShadowMatrices = &shadowTransforms; // sets the vector
  37.  
  38. glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
  39. glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
  40. glClear(GL_DEPTH_BUFFER_BIT);
  41. glDisable(GL_CULL_FACE);
  42.  
  43. glActiveTexture(GL_TEXTURE0 + config::pointShadowMapSlotStart);
  44. glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap);
  45.  
  46. // idea was that i could "layer" things later on but i haven't used that functionality yet, this just draws
  47. // the objects to the framebuffer.
  48. for (auto a : layerStack[0]->children) {
  49. a->pointDepthDraw();
  50. }
  51.  
  52. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  53. glEnable(GL_CULL_FACE);
  54.  
  55. // pointDepthDraw()
  56.  
  57. pointLightDepthShader.use();
  58. for (int a = 0; a < 6; a++) {
  59. pointLightDepthShader.setUniformMat4f("shadowMatrices[" + std::to_string(a) + "]", config::pointShadowMatrices->at(a));
  60. }
  61. pointLightDepthShader.setUniformMat4f("model", model);
  62. pointLightDepthShader.setUniformf("farPlane", Light::pointLightFar);
  63. pointLightDepthShader.setUniform3f("lightPos", 2, 2, 2);
  64.  
  65.  
  66. glBindVertexArray(vertexArrayID);
  67. glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
  68. glBindBuffer(GL_ARRAY_BUFFER, indexBufferID);
  69.  
  70. if (indices.size() == 0) {
  71. glDrawArrays(GL_TRIANGLES, 0, vertices.size());
  72. }
  73. else {
  74. glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, nullptr);
  75. }
  76.  
  77. // shader code
  78. // *NOTE, when i set the uniforms i had originally had GL_TRUE set to transpose them. i have a number of other shaders that
  79. // i would have to fix if i were to swap back now, so thats why the order looks weird.*
  80.  
  81. //shader vertex
  82. #version 430 core
  83. layout (location = 0) in vec3 coord;
  84.  
  85. uniform mat4 model;
  86.  
  87. void main () {
  88. gl_Position = vec4(coord, 1.0) * (model);
  89. }
  90.  
  91.  
  92.  
  93. //shader geometry
  94. #version 430 core
  95. layout (triangles) in;
  96. layout (triangle_strip, max_vertices = 18) out;
  97.  
  98. uniform mat4 shadowMatrices[6];
  99.  
  100. out vec4 fragPosition;
  101.  
  102. void main () {
  103. for (int face = 0; face < 6; face++) {
  104. gl_Layer = face;
  105. for (int a = 0; a < 3; a++) {
  106. fragPosition = gl_in[a].gl_Position;
  107. gl_Position = fragPosition * shadowMatrices[face];
  108. EmitVertex();
  109. }
  110. }
  111.  
  112. EndPrimitive();
  113. }
  114.  
  115.  
  116. //shader frag
  117. #version 330 core
  118. in vec4 fragPosition;
  119.  
  120. uniform vec3 lightPos;
  121. uniform float farPlane;
  122.  
  123. void main()
  124. {
  125. // get distance between fragment and light source
  126. float lightDistance = length(fragPosition.xyz - lightPos);
  127.  
  128. // map to [0;1] range by dividing by far_plane
  129. lightDistance = lightDistance / farPlane;
  130.  
  131. // write this as modified depth
  132. gl_FragDepth = lightDistance;
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement