]> gitweb.ps.run Git - subsurface_scattering/commitdiff
Merge branch 'main' of https://github.com/patrick-scho/sss into main
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 10 Feb 2021 10:56:14 +0000 (11:56 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 10 Feb 2021 10:56:14 +0000 (11:56 +0100)
25 files changed:
.vscode/launch.json [new file with mode: 0644]
.vscode/settings.json [new file with mode: 0644]
assimp-vc142-mt.dll [new file with mode: 0644]
bin/imgui-SFML.obj [new file with mode: 0644]
bin/imgui.obj [new file with mode: 0644]
bin/imgui_demo.obj [new file with mode: 0644]
bin/imgui_draw.obj [new file with mode: 0644]
bin/imgui_widgets.obj [new file with mode: 0644]
build.sh [changed mode: 0755->0644]
glew32.dll [new file with mode: 0644]
imgui.ini [new file with mode: 0644]
main.exe [new file with mode: 0644]
main.ilk [new file with mode: 0644]
main.obj [new file with mode: 0644]
main.pdb [new file with mode: 0644]
sfml-graphics-2.dll [new file with mode: 0644]
sfml-system-2.dll [new file with mode: 0644]
sfml-window-2.dll [new file with mode: 0644]
shaders/fbo_frag.glsl [new file with mode: 0644]
shaders/fbo_vert.glsl [new file with mode: 0644]
shaders/frag_irradiance.glsl [moved from shaders/frag.glsl with 52% similarity]
shaders/frag_shadowmap.glsl [new file with mode: 0644]
shaders/vert.glsl
src/main.cpp
vc140.pdb [new file with mode: 0644]

diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644 (file)
index 0000000..0abb9ae
--- /dev/null
@@ -0,0 +1,19 @@
+{\r
+  // Use IntelliSense to learn about possible attributes.\r
+  // Hover to view descriptions of existing attributes.\r
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\r
+  "version": "0.2.0",\r
+  "configurations": [\r
+    {\r
+      "name": "(Windows) Starten",\r
+      "type": "cppvsdbg",\r
+      "request": "launch",\r
+      "program": "${workspaceFolder}/main.exe",\r
+      "args": [],\r
+      "stopAtEntry": false,\r
+      "cwd": "${workspaceFolder}",\r
+      "environment": [],\r
+      "externalConsole": false\r
+    }\r
+  ]\r
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644 (file)
index 0000000..1a8d6c8
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "C_Cpp.default.includePath": [
+    "C:/prg/cpp/libs/glm",
+    "C:/prg/cpp/libs/glew-2.1.0/include",
+    "C:/prg/cpp/libs/SFML-2.5.1/include",
+    "C:/prg/cpp/libs/imgui",
+    "C:/prg/cpp/libs/imgui-sfml",
+    "C:/prg/cpp/libs/assimp-5.0.1/include",
+    "C:/prg/cpp/libs/assimp-5.0.1/build/include",
+  ],
+  "files.associations": {
+    "*.t": "lua",
+    "cmath": "cpp",
+    "istream": "cpp",
+    "array": "cpp",
+    "initializer_list": "cpp",
+    "type_traits": "cpp",
+    "vector": "cpp",
+    "xstring": "cpp",
+    "xtree": "cpp",
+    "xutility": "cpp",
+    "*.glsl": "c"
+  }
+}
\ No newline at end of file
diff --git a/assimp-vc142-mt.dll b/assimp-vc142-mt.dll
new file mode 100644 (file)
index 0000000..5aed174
Binary files /dev/null and b/assimp-vc142-mt.dll differ
diff --git a/bin/imgui-SFML.obj b/bin/imgui-SFML.obj
new file mode 100644 (file)
index 0000000..1d7867b
Binary files /dev/null and b/bin/imgui-SFML.obj differ
diff --git a/bin/imgui.obj b/bin/imgui.obj
new file mode 100644 (file)
index 0000000..de0af0d
Binary files /dev/null and b/bin/imgui.obj differ
diff --git a/bin/imgui_demo.obj b/bin/imgui_demo.obj
new file mode 100644 (file)
index 0000000..e47365d
Binary files /dev/null and b/bin/imgui_demo.obj differ
diff --git a/bin/imgui_draw.obj b/bin/imgui_draw.obj
new file mode 100644 (file)
index 0000000..f4899f6
Binary files /dev/null and b/bin/imgui_draw.obj differ
diff --git a/bin/imgui_widgets.obj b/bin/imgui_widgets.obj
new file mode 100644 (file)
index 0000000..4770f02
Binary files /dev/null and b/bin/imgui_widgets.obj differ
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/glew32.dll b/glew32.dll
new file mode 100644 (file)
index 0000000..04f9381
Binary files /dev/null and b/glew32.dll differ
diff --git a/imgui.ini b/imgui.ini
new file mode 100644 (file)
index 0000000..cf5b5fe
--- /dev/null
+++ b/imgui.ini
@@ -0,0 +1,15 @@
+[Window][Debug##Default]\r
+Pos=60,60\r
+Size=400,400\r
+Collapsed=0\r
+\r
+[Window][w]\r
+Pos=60,60\r
+Size=447,349\r
+Collapsed=0\r
+\r
+[Window][Options]\r
+Pos=17,16\r
+Size=452,298\r
+Collapsed=0\r
+\r
diff --git a/main.exe b/main.exe
new file mode 100644 (file)
index 0000000..feb0787
Binary files /dev/null and b/main.exe differ
diff --git a/main.ilk b/main.ilk
new file mode 100644 (file)
index 0000000..61cd5ff
Binary files /dev/null and b/main.ilk differ
diff --git a/main.obj b/main.obj
new file mode 100644 (file)
index 0000000..f2350dd
Binary files /dev/null and b/main.obj differ
diff --git a/main.pdb b/main.pdb
new file mode 100644 (file)
index 0000000..5aa106e
Binary files /dev/null and b/main.pdb differ
diff --git a/sfml-graphics-2.dll b/sfml-graphics-2.dll
new file mode 100644 (file)
index 0000000..e6d3e1c
Binary files /dev/null and b/sfml-graphics-2.dll differ
diff --git a/sfml-system-2.dll b/sfml-system-2.dll
new file mode 100644 (file)
index 0000000..ef86fea
Binary files /dev/null and b/sfml-system-2.dll differ
diff --git a/sfml-window-2.dll b/sfml-window-2.dll
new file mode 100644 (file)
index 0000000..269822c
Binary files /dev/null and b/sfml-window-2.dll differ
diff --git a/shaders/fbo_frag.glsl b/shaders/fbo_frag.glsl
new file mode 100644 (file)
index 0000000..e199245
--- /dev/null
@@ -0,0 +1,37 @@
+#version 330 core\r
+out vec4 FragColor;\r
+  \r
+in vec2 TexCoords;\r
+\r
+uniform sampler2D shadowmapTexture;\r
+uniform sampler2D irradianceTexture;\r
+uniform int screenWidth;\r
+uniform int screenHeight;\r
+uniform int renderState;\r
+uniform vec2 samplePositions[13];\r
+uniform vec3 sampleWeights[13];\r
+\r
+void main()\r
+{\r
+    if (renderState == 0) {\r
+        FragColor = texture(shadowmapTexture, TexCoords);\r
+    }\r
+    // stencil buffer\r
+    else if (renderState == 1 || texture(irradianceTexture, TexCoords).rgb == vec3(0, 0, 0)) {\r
+        FragColor = texture(irradianceTexture, TexCoords);\r
+    }\r
+    else if (renderState == 2) {\r
+        FragColor = texture(shadowmapTexture, TexCoords) * texture(irradianceTexture, TexCoords);\r
+    }\r
+    else if (renderState == 3) {\r
+        vec4 result = vec4(0, 0, 0, 1);\r
+        for (int i = 0; i < 13; i++) {\r
+            float oneX = 1.0/screenWidth;\r
+            float oneY = 1.0/screenHeight;\r
+            vec4 sample = texture(irradianceTexture, TexCoords + samplePositions[i] * vec2(oneX, oneY));\r
+            vec4 weight = vec4(sampleWeights[i], 1);\r
+            result += sample * weight;\r
+        }\r
+        FragColor = result;\r
+    }\r
+}\r
diff --git a/shaders/fbo_vert.glsl b/shaders/fbo_vert.glsl
new file mode 100644 (file)
index 0000000..fb80df5
--- /dev/null
@@ -0,0 +1,11 @@
+#version 330 core\r
+layout (location = 0) in vec2 aPos;\r
+layout (location = 1) in vec2 aTexCoords;\r
+\r
+out vec2 TexCoords;\r
+\r
+void main()\r
+{\r
+    gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); \r
+    TexCoords = aTexCoords;\r
+}\r
similarity index 52%
rename from shaders/frag.glsl
rename to shaders/frag_irradiance.glsl
index a92699c8dba003d7ba2fccbeb7f3a51fe9045fd0..9e14ebe2e2da8dd07e31d4cb92b71abe40cfdd6f 100644 (file)
@@ -5,9 +5,12 @@ in vec3 Normal;
 \r
 out vec4 FragColor;\r
 \r
+uniform sampler2D shadowmapTexture;\r
+\r
 uniform vec3 objectColor;\r
 uniform vec3 lightColor;\r
 uniform vec3 lightPos;\r
+uniform vec3 viewPos;\r
 \r
 void main()\r
 {\r
@@ -20,6 +23,12 @@ void main()
   float ambientStrength = 0.1;\r
   vec3 ambient = ambientStrength * lightColor;\r
 \r
-  vec3 result = (ambient + diffuse) * objectColor;\r
+  float specularStrength = 0.5;\r
+  vec3 viewDir = normalize(viewPos - FragPos);\r
+  vec3 reflectDir = reflect(-lightDir, norm);\r
+  float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);\r
+  vec3 specular = specularStrength * spec * lightColor;\r
+\r
+  vec3 result = (ambient + diffuse + specular) * objectColor;\r
   FragColor = vec4(result, 1.0f);\r
-}
\ No newline at end of file
+}\r
diff --git a/shaders/frag_shadowmap.glsl b/shaders/frag_shadowmap.glsl
new file mode 100644 (file)
index 0000000..6d6dab6
--- /dev/null
@@ -0,0 +1,14 @@
+\r
+#version 330 core\r
+\r
+in vec3 FragPos;\r
+\r
+out vec4 FragColor;\r
+\r
+uniform vec3 lightPos;\r
+\r
+void main()\r
+{\r
+  float lightDist = 1 - (length(lightPos - FragPos) - 5.5);\r
+  FragColor = vec4(vec3(lightDist), 1);\r
+}\r
index fc3721a60b48cade5e3fc7829286fb6ed220ed06..6f485734d62eab44c88ed1c2e6650ebb2006958d 100644 (file)
@@ -15,4 +15,4 @@ void main()
   gl_Position = projection * view * model * vec4(pos, 1.0);\r
   FragPos = vec3(model * vec4(pos, 1));\r
   Normal = normal;\r
-}
\ No newline at end of file
+}\r
index b95cc972121437ecb2a77ce573129ff41b72450b..dde29ec662014deda3e1e65e5b605902eeaa91eb 100644 (file)
 #include <assimp/postprocess.h>\r
 #include <assimp/scene.h>\r
 \r
+/*\r
+\r
+TODO:\r
+- ShadowMap to fbo\r
+- Save Depth to fbo\r
+\r
+*/\r
+\r
+float samplePositions[] = {\r
+  0.000000f,  0.000000f,\r
+  1.633992f,  0.036795f,\r
+  0.177801f,  1.717593f,\r
+  -0.194906f,  0.091094f,\r
+  -0.239737f, -0.220217f,\r
+  -0.003530f, -0.118219f,\r
+  1.320107f, -0.181542f,\r
+  5.970690f,  0.253378f,\r
+  -1.089250f,  4.958349f,\r
+  -4.015465f,  4.156699f,\r
+  -4.063099f, -4.110150f,\r
+  -0.638605f, -6.297663f,\r
+  2.542348f, -3.245901f\r
+};\r
+\r
+float sampleWeights[] = {\r
+  0.220441f,  0.487000f, 0.635000f,\r
+  0.076356f,  0.064487f, 0.039097f,\r
+  0.116515f,  0.103222f, 0.064912f,\r
+  0.064844f,  0.086388f, 0.062272f,\r
+  0.131798f,  0.151695f, 0.103676f,\r
+  0.025690f,  0.042728f, 0.033003f,\r
+  0.048593f,  0.064740f, 0.046131f,\r
+  0.048092f,  0.003042f, 0.000400f,\r
+  0.048845f,  0.005406f, 0.001222f,\r
+  0.051322f,  0.006034f, 0.001420f,\r
+  0.061428f,  0.009152f, 0.002511f,\r
+  0.030936f,  0.002868f, 0.000652f,\r
+  0.073580f,  0.023239f, 0.009703f\r
+};\r
+\r
 struct model {\r
   std::vector<float> vertices;\r
   std::vector<GLuint> indices;\r
@@ -51,10 +91,10 @@ private:
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),\r
                 indices.data(), GL_STATIC_DRAW);\r
 \r
-    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
     glEnableVertexAttribArray(0);\r
-    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
     glEnableVertexAttribArray(1);\r
+    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
 \r
     glBindVertexArray(0);\r
   }\r
@@ -142,6 +182,16 @@ struct arccam {
       rot.y = glm::radians(minY) * angleFactor;\r
   }\r
 \r
+  glm::vec3 getPos() {\r
+    float angle = rot.y / angleFactor;\r
+  \r
+    float camY = sin(angle) * exp(radius);\r
+    float camZ = cos(angle) * exp(radius);\r
+\r
+    glm::vec3 result(0.0, camY, camZ);\r
+    return glm::rotate(result, -rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+  }\r
+\r
   glm::mat4 getViewMatrix() {\r
     float angle = rot.y / angleFactor;\r
   \r
@@ -160,14 +210,10 @@ private:
 \r
 std::string readFile(std::string filename) {\r
   std::ifstream ifs(filename, std::ios::binary);\r
-  ifs.seekg(0, ifs.end);\r
-  long length = ifs.tellg();\r
-  ifs.seekg(0, ifs.beg);\r
-  char *buffer = (char*)malloc(length);\r
-  ifs.read(buffer, length);\r
-  ifs.close();\r
-  std::string result(buffer);\r
-  free(buffer);\r
+  std::string result, line;\r
+  while (std::getline(ifs, line))\r
+    result += line + "\n";\r
+\r
   return result;\r
 }\r
 \r
@@ -213,7 +259,7 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
   glGetShaderiv(vertShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
     glGetShaderInfoLog(vertShader, 512, NULL, infoLog);\r
-    printf("Error compiling vertex shader: %s\n", infoLog);\r
+    printf("Error compiling vertex shader(%s): %s\n", vertFilename, infoLog);\r
   }\r
 \r
   GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);\r
@@ -225,7 +271,7 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
   glGetShaderiv(fragShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
     glGetShaderInfoLog(fragShader, 512, NULL, infoLog);\r
-    printf("Error compiling fragment shader: %s\n", infoLog);\r
+    printf("Error compiling fragment shader(%s): %s\n", fragFilename, infoLog);\r
   }\r
 \r
   // Link Shader Program\r
@@ -248,9 +294,82 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
 }\r
 \r
 \r
+struct framebuffer {\r
+  framebuffer(const char *vertFilename, const char *fragFilename, int width, int height) {\r
+    glGenFramebuffers(1, &fbo);\r
+    glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+    \r
+    glGenTextures(1, &renderTexture);\r
+    glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);\r
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\r
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\r
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\r
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
+    //glBindTexture(GL_TEXTURE_2D, 0);\r
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0);\r
+\r
+    glGenRenderbuffers(1, &rbo);\r
+    glBindRenderbuffer(GL_RENDERBUFFER, rbo);\r
+    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);\r
+    //glBindRenderbuffer(GL_RENDERBUFFER, 0);\r
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);\r
+\r
+    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {\r
+      printf("Successfully created framebuffer\n");\r
+    }\r
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+    \r
+    screenShaderProgram = compileShaders(vertFilename, fragFilename);\r
+    glUseProgram(screenShaderProgram);\r
+    glUniform1i(glGetUniformLocation(screenShaderProgram, "screenTexture"), 0);\r
+\r
+    // Screen VAO\r
+    \r
+    glGenBuffers(1, &screenVBO);\r
+\r
+    glGenVertexArrays(1, &screenVAO);\r
+\r
+    glBindVertexArray(screenVAO);\r
+\r
+    float screenVerts[] = {\r
+      -1.0f, +1.0f, +0.0f, +1.0f,\r
+      -1.0f, -1.0f, +0.0f, +0.0f,\r
+      +1.0f, -1.0f, +1.0f, +0.0f,\r
+  \r
+      -1.0f, +1.0f, +0.0f, +1.0f,\r
+      +1.0f, -1.0f, +1.0f, +0.0f,\r
+      +1.0f, +1.0f, +1.0f, +1.0f,\r
+    };\r
+\r
+    glBindBuffer(GL_ARRAY_BUFFER, screenVBO);\r
+    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4,\r
+                screenVerts, GL_STATIC_DRAW);\r
+\r
+    glEnableVertexAttribArray(0);\r
+    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(0));\r
+    glEnableVertexAttribArray(1);\r
+    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(sizeof(float) * 2));\r
+\r
+    glBindVertexArray(0);\r
+  }\r
+  ~framebuffer() {\r
+    glDeleteFramebuffers(1, &fbo);\r
+  }\r
+  \r
+  GLuint fbo;\r
+  GLuint renderTexture;\r
+  GLuint rbo;\r
+  GLuint screenShaderProgram;\r
+  GLuint screenVBO;\r
+  GLuint screenVAO;\r
+};\r
+\r
 int main() {\r
   // Window Setup\r
 \r
+  const int width = 1600, height = 900;\r
+\r
   sf::ContextSettings settings;\r
   settings.depthBits = 24;\r
   settings.antialiasingLevel = 0;\r
@@ -268,7 +387,8 @@ int main() {
   if (glewInit() != GLEW_OK) {\r
   }\r
 \r
-  GLuint shaderProgram = compileShaders("shaders/vert.glsl", "shaders/frag.glsl");\r
+  GLuint shaderProgramShadowmap = compileShaders("shaders/vert.glsl", "shaders/frag_shadowmap.glsl");\r
+  GLuint shaderProgramIrradiance = compileShaders("shaders/vert.glsl", "shaders/frag_irradiance.glsl");\r
 \r
   model m = loadModel("models/Isotrop-upperjaw.ply");\r
 \r
@@ -285,9 +405,17 @@ int main() {
 \r
   glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
 \r
+  // Framebuffer\r
+  framebuffer fb_shadowmap("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl", width, height);\r
+  framebuffer fb_irradiance("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl", width, height);\r
+\r
+  // Config\r
+\r
   struct {\r
     bool wireframe = false;\r
     bool freecam = false;\r
+    int renderState = 0;\r
+    float color[3] = { 0.7f, 0.4f, 0.4f };\r
   } options;\r
 \r
   sf::Clock deltaClock;\r
@@ -343,10 +471,46 @@ int main() {
 \r
     prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right);\r
 \r
-    // Render\r
+    // Render Shadowmap\r
 \r
+    glBindFramebuffer(GL_FRAMEBUFFER, fb_shadowmap.fbo);\r
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\r
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
+    glEnable(GL_DEPTH_TEST);\r
+\r
+    if (options.wireframe)\r
+      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\r
+    else\r
+      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
+\r
+    glUseProgram(shaderProgramShadowmap);\r
+    \r
+    if (options.freecam)\r
+      view = freeCam.getViewMatrix();\r
+    else\r
+      view = arcCam.getViewMatrix();\r
+    \r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramShadowmap, "model"),\r
+      1, GL_FALSE, glm::value_ptr(model));\r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramShadowmap, "view"),\r
+      1, GL_FALSE, glm::value_ptr(view));\r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramShadowmap, "projection"),\r
+      1, GL_FALSE, glm::value_ptr(proj));\r
+\r
+    glUniform3fv(\r
+      glGetUniformLocation(shaderProgramShadowmap, "lightPos"),\r
+      1, glm::value_ptr(lightPos));\r
+\r
+    m.draw();\r
 \r
+    // Render irradiance\r
+\r
+    glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo);\r
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\r
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
     glEnable(GL_DEPTH_TEST);\r
 \r
     if (options.wireframe)\r
@@ -354,7 +518,7 @@ int main() {
     else\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
-    glUseProgram(shaderProgram);\r
+    glUseProgram(shaderProgramIrradiance);\r
     \r
     if (options.freecam)\r
       view = freeCam.getViewMatrix();\r
@@ -362,34 +526,67 @@ int main() {
       view = arcCam.getViewMatrix();\r
     \r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgram, "model"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "model"),\r
       1, GL_FALSE, glm::value_ptr(model));\r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgram, "view"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "view"),\r
       1, GL_FALSE, glm::value_ptr(view));\r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgram, "projection"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "projection"),\r
       1, GL_FALSE, glm::value_ptr(proj));\r
 \r
+    glUniform3fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "objectColor"),\r
+      1, options.color);\r
     glUniform3f(\r
-      glGetUniformLocation(shaderProgram, "objectColor"),\r
-      1.0f, 0.5f, 0.31f);\r
-    glUniform3f(\r
-      glGetUniformLocation(shaderProgram, "lightColor"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightColor"),\r
       1.0f, 1.0f, 1.0f);\r
     glUniform3fv(\r
-      glGetUniformLocation(shaderProgram, "lightPos"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightPos"),\r
       1, glm::value_ptr(lightPos));\r
+    glUniform3fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "viewPos"),\r
+      1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
+      \r
+    glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "shadowmapTexture"), 0);\r
+    glActiveTexture(GL_TEXTURE0 + 0);\r
+    glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture);\r
 \r
     m.draw();\r
+\r
+    // Render fbo to screen\r
     \r
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+    glDisable(GL_DEPTH_TEST);\r
+    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);\r
+    glClear(GL_COLOR_BUFFER_BIT);\r
+    glUseProgram(fb_irradiance.screenShaderProgram);\r
+\r
+    glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "screenWidth"), window.getSize().x);\r
+    glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "screenHeight"), window.getSize().y);\r
+    glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "renderState"), options.renderState);\r
+    glUniform2fv(glGetUniformLocation(fb_irradiance.screenShaderProgram, "samplePositions"), 13, samplePositions);\r
+    glUniform3fv(glGetUniformLocation(fb_irradiance.screenShaderProgram, "sampleWeights"), 13, sampleWeights);\r
+\r
+    glBindVertexArray(fb_irradiance.screenVAO);\r
+    glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "shadowmapTexture"), 0);\r
+    glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "irradianceTexture"), 1);\r
+    glActiveTexture(GL_TEXTURE0 + 0);\r
+    glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture);\r
+    glActiveTexture(GL_TEXTURE0 + 1);\r
+    glBindTexture(GL_TEXTURE_2D, fb_irradiance.renderTexture);\r
+    glDrawArrays(GL_TRIANGLES, 0, 6);\r
+    glBindVertexArray(0);\r
+\r
     ImGui::SFML::Update(window, deltaClock.restart());\r
 \r
     ImGui::Begin("Options");\r
     ImGui::Checkbox("Wireframe", &options.wireframe);\r
     ImGui::Checkbox("Free Cam", &options.freecam);\r
+    ImGui::InputInt("Render State", &options.renderState);\r
+    ImGui::InputFloat3("Color", options.color, 2);\r
     if (options.freecam) {\r
       ImGui::LabelText("Position", "%f %f %f", freeCam.pos.x, freeCam.pos.y, freeCam.pos.z);\r
       ImGui::LabelText("Rotation", "%f %f", freeCam.rot.x, freeCam.rot.y);\r
@@ -399,7 +596,7 @@ int main() {
       }\r
     } else {\r
       ImGui::LabelText("Rotation", "%f %f", arcCam.rot.x, arcCam.rot.y);\r
-      ImGui::InputFloat("Radius", &arcCam.radius);\r
+      ImGui::DragFloat("Radius", &arcCam.radius, 0.01f, -1.0f, 1.0f);\r
       if (ImGui::Button("Reset")) {\r
         arcCam.rot = glm::vec2(0);\r
         arcCam.radius = 1;\r
diff --git a/vc140.pdb b/vc140.pdb
new file mode 100644 (file)
index 0000000..5bcb5e5
Binary files /dev/null and b/vc140.pdb differ