]> gitweb.ps.run Git - subsurface_scattering/blobdiff - src/main.cpp
fix translucency, add gaussian blur to shader
[subsurface_scattering] / src / main.cpp
index dde29ec662014deda3e1e65e5b605902eeaa91eb..24a39cc85510f5b5896a50e236028e4e21cdac90 100644 (file)
 /*\r
 \r
 TODO:\r
-- ShadowMap to fbo\r
 - Save Depth to fbo\r
+- Stencil Buffer\r
+- LightDist > 1\r
+  - 1 - distanceToBackside in frag_irradiance\r
+- ShadowMap Perspective (no projection?)\r
+- (Implement Gaussian Blur)\r
+- LightDir nicht immer zu 0 0 0\r
 \r
 */\r
 \r
@@ -101,7 +106,6 @@ private:
   GLuint VAO = 0;\r
 };\r
 \r
-\r
 struct freecam {\r
   glm::vec3 pos = glm::vec3(0, 0, -1);\r
   glm::vec2 rot = glm::vec2(0, 0);\r
@@ -155,7 +159,6 @@ private:
   float moveFactor = 20;\r
 };\r
 \r
-\r
 struct arccam {\r
   glm::vec2 rot = glm::vec2(0, 0);\r
   float radius = 1;\r
@@ -207,7 +210,6 @@ private:
   const float angleFactor = 200;\r
 };\r
 \r
-\r
 std::string readFile(std::string filename) {\r
   std::ifstream ifs(filename, std::ios::binary);\r
   std::string result, line;\r
@@ -222,19 +224,22 @@ model loadModel(const std::string &filename) {
 \r
   const aiScene *scene = importer.ReadFile(\r
       filename, aiProcess_CalcTangentSpace | aiProcess_Triangulate |\r
-                    aiProcess_SortByPType | aiProcess_GenSmoothNormals);\r
+                    aiProcess_SortByPType | aiProcess_GenSmoothNormals |\r
+                    aiProcess_GenUVCoords);\r
 \r
   model result;\r
 \r
+  printf("uv channels: %d\n", scene->mMeshes[0]->GetNumUVChannels());\r
+\r
   for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) {\r
     aiVector3D v = scene->mMeshes[0]->mVertices[i];\r
     aiVector3D n = scene->mMeshes[0]->mNormals[i];\r
-    result.vertices.push_back(v.x);\r
-    result.vertices.push_back(v.y);\r
-    result.vertices.push_back(v.z);\r
-    result.vertices.push_back(n.x);\r
-    result.vertices.push_back(n.y);\r
-    result.vertices.push_back(n.z);\r
+    result.vertices.push_back(v.x * 100);\r
+    result.vertices.push_back(v.y * 100);\r
+    result.vertices.push_back(v.z * 100);\r
+    result.vertices.push_back(n.x * 100);\r
+    result.vertices.push_back(n.y * 100);\r
+    result.vertices.push_back(n.z * 100);\r
   }\r
 \r
   for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
@@ -293,7 +298,6 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
   return shaderProgram;\r
 }\r
 \r
-\r
 struct framebuffer {\r
   framebuffer(const char *vertFilename, const char *fragFilename, int width, int height) {\r
     glGenFramebuffers(1, &fbo);\r
@@ -387,23 +391,23 @@ int main() {
   if (glewInit() != GLEW_OK) {\r
   }\r
 \r
-  GLuint shaderProgramShadowmap = compileShaders("shaders/vert.glsl", "shaders/frag_shadowmap.glsl");\r
-  GLuint shaderProgramIrradiance = compileShaders("shaders/vert.glsl", "shaders/frag_irradiance.glsl");\r
+  GLuint shaderProgramShadowmap = compileShaders("shaders/vert_shadowmap.glsl", "shaders/frag_shadowmap.glsl");\r
+  GLuint shaderProgramIrradiance = compileShaders("shaders/vert_irradiance.glsl", "shaders/frag_irradiance.glsl");\r
 \r
-  model m = loadModel("models/Isotrop-upperjaw.ply");\r
+  //model m = loadModel("models/Isotrop-upperjaw.ply");\r
+  model m = loadModel("models/african_head/african_head.obj");\r
 \r
   arccam arcCam;\r
   freecam freeCam;\r
-      \r
-  glm::vec3 lightPos(1.2f, 5.0f, 2.0f);\r
 \r
   // MVP\r
 \r
   glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f));\r
 \r
-  glm::mat4 view;\r
+  glm::mat4 view, lightView;\r
 \r
   glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
+  glm::mat4 lightProj = glm::perspective(glm::radians(90.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
@@ -411,12 +415,18 @@ int main() {
 \r
   // Config\r
 \r
-  struct {\r
+  const struct {\r
     bool wireframe = false;\r
     bool freecam = false;\r
-    int renderState = 0;\r
+    int renderState = 2;\r
     float color[3] = { 0.7f, 0.4f, 0.4f };\r
-  } options;\r
+    glm::vec3 lightPos = glm::vec3(0.0f, 0.04f, -0.08f);\r
+    float transmittanceScale = 0.005f;\r
+    float powBase = 2.718;\r
+    float powFactor = 1;\r
+  } DefaultOptions;\r
+\r
+  auto options = DefaultOptions;\r
 \r
   sf::Clock deltaClock;\r
 \r
@@ -473,6 +483,10 @@ int main() {
 \r
     // Render Shadowmap\r
 \r
+    glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE);\r
+    glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);\r
+    glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);\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
@@ -490,19 +504,21 @@ int main() {
     else\r
       view = arcCam.getViewMatrix();\r
     \r
+    lightView = glm::lookAt(options.lightPos, glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));\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
+      glGetUniformLocation(shaderProgramShadowmap, "lightView"),\r
+      1, GL_FALSE, glm::value_ptr(lightView));\r
     glUniformMatrix4fv(\r
       glGetUniformLocation(shaderProgramShadowmap, "projection"),\r
-      1, GL_FALSE, glm::value_ptr(proj));\r
+      1, GL_FALSE, glm::value_ptr(lightProj));\r
 \r
     glUniform3fv(\r
       glGetUniformLocation(shaderProgramShadowmap, "lightPos"),\r
-      1, glm::value_ptr(lightPos));\r
+      1, glm::value_ptr(options.lightPos));\r
 \r
     m.draw();\r
 \r
@@ -520,20 +536,41 @@ int main() {
 \r
     glUseProgram(shaderProgramIrradiance);\r
     \r
-    if (options.freecam)\r
-      view = freeCam.getViewMatrix();\r
-    else\r
-      view = arcCam.getViewMatrix();\r
-    \r
     glUniformMatrix4fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "model"),\r
       1, GL_FALSE, glm::value_ptr(model));\r
     glUniformMatrix4fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "view"),\r
       1, GL_FALSE, glm::value_ptr(view));\r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightView"),\r
+      1, GL_FALSE, glm::value_ptr(lightView));\r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightViewInv"),\r
+      1, GL_FALSE, glm::value_ptr(glm::inverse(lightView)));\r
     glUniformMatrix4fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "projection"),\r
       1, GL_FALSE, glm::value_ptr(proj));\r
+    glUniformMatrix4fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightProjection"),\r
+      1, GL_FALSE, glm::value_ptr(lightProj));\r
+    glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "screenWidth"), window.getSize().x);\r
+    glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "screenHeight"), window.getSize().y);\r
+    glUniform2fv(glGetUniformLocation(shaderProgramIrradiance, "samplePositions"), 13, samplePositions);\r
+    glUniform3fv(glGetUniformLocation(shaderProgramIrradiance, "sampleWeights"), 13, sampleWeights);\r
+\r
+    glUniform1f(\r
+      glGetUniformLocation(shaderProgramIrradiance, "transmittanceScale"),\r
+      options.transmittanceScale);\r
+    glUniform1i(\r
+      glGetUniformLocation(shaderProgramIrradiance, "renderState"),\r
+      options.renderState);\r
+    glUniform1f(\r
+      glGetUniformLocation(shaderProgramIrradiance, "powBase"),\r
+      options.powBase);\r
+    glUniform1f(\r
+      glGetUniformLocation(shaderProgramIrradiance, "powFactor"),\r
+      options.powFactor);\r
 \r
     glUniform3fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "objectColor"),\r
@@ -543,7 +580,7 @@ int main() {
       1.0f, 1.0f, 1.0f);\r
     glUniform3fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "lightPos"),\r
-      1, glm::value_ptr(lightPos));\r
+      1, glm::value_ptr(options.lightPos));\r
     glUniform3fv(\r
       glGetUniformLocation(shaderProgramIrradiance, "viewPos"),\r
       1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
@@ -586,13 +623,18 @@ int main() {
     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
+    ImGui::DragFloat3("Color", options.color, 0.01, 0, 1);\r
+    ImGui::DragFloat("Transmittance Scale", &options.transmittanceScale, 0.0001f, 0, 0.3);\r
+    ImGui::DragFloat("Pow Base", &options.powBase, 0.01f, 0, 4);\r
+    ImGui::DragFloat("Pow Factor", &options.powFactor, 0.01f, 0, 3);\r
+    ImGui::DragFloat3("Light Pos", glm::value_ptr(options.lightPos), 0.01, -5, 5);\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
       if (ImGui::Button("Reset")) {\r
         freeCam.pos = glm::vec3(0, 0, -1);\r
         freeCam.rot = glm::vec2(0);\r
+        options = DefaultOptions;\r
       }\r
     } else {\r
       ImGui::LabelText("Rotation", "%f %f", arcCam.rot.x, arcCam.rot.y);\r
@@ -600,6 +642,7 @@ int main() {
       if (ImGui::Button("Reset")) {\r
         arcCam.rot = glm::vec2(0);\r
         arcCam.radius = 1;\r
+        options = DefaultOptions;\r
       }\r
     }\r
     ImGui::End();\r