X-Git-Url: https://gitweb.ps.run/subsurface_scattering/blobdiff_plain/a0fdc6d882a1755d0b0607ba3d9bb55e7f8ac006..0a5e8172a6ee0e79c81eec21a9966bea9385b249:/src/main.cpp diff --git a/src/main.cpp b/src/main.cpp index 24a39cc..168d01d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,18 +20,9 @@ #include #include -/* -TODO: -- Save Depth to fbo -- Stencil Buffer -- LightDist > 1 - - 1 - distanceToBackside in frag_irradiance -- ShadowMap Perspective (no projection?) -- (Implement Gaussian Blur) -- LightDir nicht immer zu 0 0 0 - -*/ +// sample positions and weights for a Gaussian kernel from +// Hable, John ; Borshukov, George ; Hejl, Jim: Fast Skin Shading. In: ShaderX7, ShaderX : Charles River Media, 2009, S. 161–173 float samplePositions[] = { 0.000000f, 0.000000f, @@ -234,12 +225,12 @@ model loadModel(const std::string &filename) { for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) { aiVector3D v = scene->mMeshes[0]->mVertices[i]; aiVector3D n = scene->mMeshes[0]->mNormals[i]; - result.vertices.push_back(v.x * 100); - result.vertices.push_back(v.y * 100); - result.vertices.push_back(v.z * 100); - result.vertices.push_back(n.x * 100); - result.vertices.push_back(n.y * 100); - result.vertices.push_back(n.z * 100); + result.vertices.push_back(v.x); + result.vertices.push_back(v.y); + result.vertices.push_back(v.z); + result.vertices.push_back(n.x); + result.vertices.push_back(n.y); + result.vertices.push_back(n.z); } for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) { @@ -394,9 +385,8 @@ int main() { GLuint shaderProgramShadowmap = compileShaders("shaders/vert_shadowmap.glsl", "shaders/frag_shadowmap.glsl"); GLuint shaderProgramIrradiance = compileShaders("shaders/vert_irradiance.glsl", "shaders/frag_irradiance.glsl"); - //model m = loadModel("models/Isotrop-upperjaw.ply"); - model m = loadModel("models/african_head/african_head.obj"); - + model m = loadModel("models/Isotrop-upperjaw.ply"); + arccam arcCam; freecam freeCam; @@ -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); // Framebuffer + framebuffer fb_shadowmap("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl", width, height); framebuffer fb_irradiance("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl", width, height); @@ -420,10 +411,10 @@ int main() { bool freecam = false; int renderState = 2; float color[3] = { 0.7f, 0.4f, 0.4f }; - glm::vec3 lightPos = glm::vec3(0.0f, 0.04f, -0.08f); - float transmittanceScale = 0.005f; - float powBase = 2.718; - float powFactor = 1; + glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 0.03f); + float transmittanceScale = 0.025f; + float powBase = 2; + float powFactor = 1.5; } DefaultOptions; auto options = DefaultOptions; @@ -458,7 +449,7 @@ int main() { } } - // Update + // Update Camera if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { window.setMouseCursorVisible(false); @@ -481,7 +472,7 @@ int main() { prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right); - // Render Shadowmap + // Render Shadowmap to fbo glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); @@ -522,7 +513,7 @@ int main() { m.draw(); - // Render irradiance + // Render irradiance map to fbo glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -556,7 +547,7 @@ int main() { 1, GL_FALSE, glm::value_ptr(lightProj)); glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "screenWidth"), window.getSize().x); glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "screenHeight"), window.getSize().y); - glUniform2fv(glGetUniformLocation(shaderProgramIrradiance, "samplePositions"), 13, samplePositions); + glUniform1fv(glGetUniformLocation(shaderProgramIrradiance, "samplePositions"), 13, samplePositions); glUniform3fv(glGetUniformLocation(shaderProgramIrradiance, "sampleWeights"), 13, sampleWeights); glUniform1f( @@ -585,13 +576,14 @@ int main() { glGetUniformLocation(shaderProgramIrradiance, "viewPos"), 1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos())); + glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "shadowmapTexture"), 0); glActiveTexture(GL_TEXTURE0 + 0); glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture); m.draw(); - // Render fbo to screen + // Render fbos to screen and calculate light spread/translucency in shader glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); @@ -617,6 +609,8 @@ int main() { glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); + // menu + ImGui::SFML::Update(window, deltaClock.restart()); ImGui::Begin("Options"); @@ -625,8 +619,6 @@ int main() { ImGui::InputInt("Render State", &options.renderState); ImGui::DragFloat3("Color", options.color, 0.01, 0, 1); ImGui::DragFloat("Transmittance Scale", &options.transmittanceScale, 0.0001f, 0, 0.3); - ImGui::DragFloat("Pow Base", &options.powBase, 0.01f, 0, 4); - ImGui::DragFloat("Pow Factor", &options.powFactor, 0.01f, 0, 3); ImGui::DragFloat3("Light Pos", glm::value_ptr(options.lightPos), 0.01, -5, 5); if (options.freecam) { ImGui::LabelText("Position", "%f %f %f", freeCam.pos.x, freeCam.pos.y, freeCam.pos.z);