]> gitweb.ps.run Git - subsurface_scattering/blobdiff - src/main2.cpp
remove debugging renderstate
[subsurface_scattering] / src / main2.cpp
index 24a39cc85510f5b5896a50e236028e4e21cdac90..c30fb9e1ef2e6ee722a682ea10bb715c599ec9b6 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
@@ -97,9 +88,11 @@ private:
                 indices.data(), GL_STATIC_DRAW);\r
 \r
     glEnableVertexAttribArray(0);\r
-    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
+    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(0));\r
     glEnableVertexAttribArray(1);\r
-    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 3));\r
+    glEnableVertexAttribArray(2);\r
+    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 6));\r
 \r
     glBindVertexArray(0);\r
   }\r
@@ -224,22 +217,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_GenUVCoords);\r
+                    aiProcess_SortByPType | aiProcess_GenSmoothNormals);\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
+    aiVector3D t = scene->mMeshes[0]->mTextureCoords[0][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(n.x);\r
+    result.vertices.push_back(n.y);\r
+    result.vertices.push_back(n.z);\r
+    result.vertices.push_back(t.x);\r
+    result.vertices.push_back(t.y);\r
   }\r
 \r
   for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
@@ -391,10 +384,9 @@ int main() {
   if (glewInit() != GLEW_OK) {\r
   }\r
 \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
+  GLuint shaderProgramIrradiance = compileShaders("shaders/ts_vert_irradiance.glsl", "shaders/ts_frag_irradiance.glsl");\r
+  GLuint shaderProgramCombine = compileShaders("shaders/ts_vert.glsl", "shaders/ts_frag.glsl");\r
 \r
-  //model m = loadModel("models/Isotrop-upperjaw.ply");\r
   model m = loadModel("models/african_head/african_head.obj");\r
 \r
   arccam arcCam;\r
@@ -418,9 +410,9 @@ int main() {
   const struct {\r
     bool wireframe = false;\r
     bool freecam = false;\r
-    int renderState = 2;\r
+    int renderState = 1;\r
     float color[3] = { 0.7f, 0.4f, 0.4f };\r
-    glm::vec3 lightPos = glm::vec3(0.0f, 0.04f, -0.08f);\r
+    glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 0.25f);\r
     float transmittanceScale = 0.005f;\r
     float powBase = 2.718;\r
     float powFactor = 1;\r
@@ -481,13 +473,9 @@ int main() {
 \r
     prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right);\r
 \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
+    // Render Shadowmap to fbo\r
 \r
-    glBindFramebuffer(GL_FRAMEBUFFER, fb_shadowmap.fbo);\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
@@ -497,34 +485,41 @@ int main() {
     else\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
-    glUseProgram(shaderProgramShadowmap);\r
+    glUseProgram(shaderProgramIrradiance);\r
     \r
     if (options.freecam)\r
       view = freeCam.getViewMatrix();\r
     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
+      glGetUniformLocation(shaderProgramIrradiance, "model"),\r
       1, GL_FALSE, glm::value_ptr(model));\r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgramShadowmap, "lightView"),\r
-      1, GL_FALSE, glm::value_ptr(lightView));\r
+      glGetUniformLocation(shaderProgramIrradiance, "view"),\r
+      1, GL_FALSE, glm::value_ptr(view));\r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgramShadowmap, "projection"),\r
-      1, GL_FALSE, glm::value_ptr(lightProj));\r
+      glGetUniformLocation(shaderProgramIrradiance, "projection"),\r
+      1, GL_FALSE, glm::value_ptr(proj));\r
 \r
     glUniform3fv(\r
-      glGetUniformLocation(shaderProgramShadowmap, "lightPos"),\r
+      glGetUniformLocation(shaderProgramIrradiance, "objectColor"),\r
+      1, options.color);\r
+    glUniform3f(\r
+      glGetUniformLocation(shaderProgramIrradiance, "lightColor"),\r
+      1.0f, 1.0f, 1.0f);\r
+    glUniform3fv(\r
+      glGetUniformLocation(shaderProgramIrradiance, "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
 \r
     m.draw();\r
 \r
-    // Render irradiance\r
+    // Render model and calculate light spread and translucency in shader\r
 \r
-    glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo);\r
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);\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
@@ -534,95 +529,56 @@ int main() {
     else\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
-    glUseProgram(shaderProgramIrradiance);\r
+    glUseProgram(shaderProgramCombine);\r
+    \r
+    if (options.freecam)\r
+      view = freeCam.getViewMatrix();\r
+    else\r
+      view = arcCam.getViewMatrix();\r
     \r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgramIrradiance, "model"),\r
+      glGetUniformLocation(shaderProgramCombine, "model"),\r
       1, GL_FALSE, glm::value_ptr(model));\r
     glUniformMatrix4fv(\r
-      glGetUniformLocation(shaderProgramIrradiance, "view"),\r
+      glGetUniformLocation(shaderProgramCombine, "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
+      glGetUniformLocation(shaderProgramCombine, "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
+      glGetUniformLocation(shaderProgramCombine, "objectColor"),\r
       1, options.color);\r
     glUniform3f(\r
-      glGetUniformLocation(shaderProgramIrradiance, "lightColor"),\r
+      glGetUniformLocation(shaderProgramCombine, "lightColor"),\r
       1.0f, 1.0f, 1.0f);\r
     glUniform3fv(\r
-      glGetUniformLocation(shaderProgramIrradiance, "lightPos"),\r
+      glGetUniformLocation(shaderProgramCombine, "lightPos"),\r
       1, glm::value_ptr(options.lightPos));\r
     glUniform3fv(\r
-      glGetUniformLocation(shaderProgramIrradiance, "viewPos"),\r
+      glGetUniformLocation(shaderProgramCombine, "viewPos"),\r
       1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
+\r
+    glUniform1i(glGetUniformLocation(shaderProgramCombine, "screenWidth"), window.getSize().x);\r
+    glUniform1i(glGetUniformLocation(shaderProgramCombine, "screenHeight"), window.getSize().y);\r
+    glUniform1i(glGetUniformLocation(shaderProgramCombine, "renderState"), options.renderState);\r
+    glUniform2fv(glGetUniformLocation(shaderProgramCombine, "samplePositions"), 13, samplePositions);\r
+    glUniform3fv(glGetUniformLocation(shaderProgramCombine, "sampleWeights"), 13, sampleWeights);\r
+    glUniform1f(glGetUniformLocation(shaderProgramCombine, "transmittanceScale"), options.transmittanceScale);\r
       \r
-    glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "shadowmapTexture"), 0);\r
+    glUniform1i(glGetUniformLocation(shaderProgramCombine, "irradianceTexture"), 0);\r
     glActiveTexture(GL_TEXTURE0 + 0);\r
-    glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture);\r
+    glBindTexture(GL_TEXTURE_2D, fb_irradiance.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
+    // menu\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::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