]> gitweb.ps.run Git - subsurface_scattering/blobdiff - src/main.cpp
comments TS SSS
[subsurface_scattering] / src / main.cpp
index 24a39cc85510f5b5896a50e236028e4e21cdac90..168d01d3b42fc66280504c93cf42de742c155fb8 100644 (file)
 #include <assimp/postprocess.h>\r
 #include <assimp/scene.h>\r
 \r
-/*\r
 \r
-TODO:\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
+// sample positions and weights for a Gaussian kernel from \r
+// Hable, John ; Borshukov, George ; Hejl, Jim: Fast Skin Shading. In: ShaderX7, ShaderX : Charles River Media, 2009, S. 161–173\r
 \r
 float samplePositions[] = {\r
   0.000000f,  0.000000f,\r
@@ -234,12 +225,12 @@ model loadModel(const std::string &filename) {
   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 * 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
+    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
   }\r
 \r
   for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
@@ -394,9 +385,8 @@ int main() {
   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/african_head/african_head.obj");\r
-\r
+  model m = loadModel("models/Isotrop-upperjaw.ply");\r
+  \r
   arccam arcCam;\r
   freecam freeCam;\r
 \r
@@ -410,6 +400,7 @@ int main() {
   glm::mat4 lightProj = glm::perspective(glm::radians(90.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
 \r
   // Framebuffer\r
+\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
@@ -420,10 +411,10 @@ int main() {
     bool freecam = false;\r
     int renderState = 2;\r
     float color[3] = { 0.7f, 0.4f, 0.4f };\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
+    glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 0.03f);\r
+    float transmittanceScale = 0.025f;\r
+    float powBase = 2;\r
+    float powFactor = 1.5;\r
   } DefaultOptions;\r
 \r
   auto options = DefaultOptions;\r
@@ -458,7 +449,7 @@ int main() {
       }\r
     }\r
 \r
-    // Update\r
+    // Update Camera\r
 \r
     if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) {\r
       window.setMouseCursorVisible(false);\r
@@ -481,7 +472,7 @@ int main() {
 \r
     prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right);\r
 \r
-    // Render Shadowmap\r
+    // Render Shadowmap to fbo\r
 \r
     glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE);\r
     glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);\r
@@ -522,7 +513,7 @@ int main() {
 \r
     m.draw();\r
 \r
-    // Render irradiance\r
+    // Render irradiance map to fbo\r
 \r
     glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo);\r
     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\r
@@ -556,7 +547,7 @@ int main() {
       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
+    glUniform1fv(glGetUniformLocation(shaderProgramIrradiance, "samplePositions"), 13, samplePositions);\r
     glUniform3fv(glGetUniformLocation(shaderProgramIrradiance, "sampleWeights"), 13, sampleWeights);\r
 \r
     glUniform1f(\r
@@ -585,13 +576,14 @@ int main() {
       glGetUniformLocation(shaderProgramIrradiance, "viewPos"),\r
       1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
       \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
+    // Render fbos to screen and calculate light spread/translucency in shader\r
     \r
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
@@ -617,6 +609,8 @@ int main() {
     glDrawArrays(GL_TRIANGLES, 0, 6);\r
     glBindVertexArray(0);\r
 \r
+    // menu\r
+\r
     ImGui::SFML::Update(window, deltaClock.restart());\r
 \r
     ImGui::Begin("Options");\r
@@ -625,8 +619,6 @@ int main() {
     ImGui::InputInt("Render State", &options.renderState);\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