X-Git-Url: https://gitweb.ps.run/subsurface_scattering/blobdiff_plain/a0fdc6d882a1755d0b0607ba3d9bb55e7f8ac006..HEAD:/src/main2.cpp diff --git a/src/main2.cpp b/src/main2.cpp index 24a39cc..e57639a 100644 --- a/src/main2.cpp +++ b/src/main2.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, @@ -97,9 +88,11 @@ private: indices.data(), GL_STATIC_DRAW); glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0)); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(0)); glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3)); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 3)); + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 6)); glBindVertexArray(0); } @@ -224,22 +217,22 @@ model loadModel(const std::string &filename) { const aiScene *scene = importer.ReadFile( filename, aiProcess_CalcTangentSpace | aiProcess_Triangulate | - aiProcess_SortByPType | aiProcess_GenSmoothNormals | - aiProcess_GenUVCoords); + aiProcess_SortByPType | aiProcess_GenSmoothNormals); model result; - printf("uv channels: %d\n", scene->mMeshes[0]->GetNumUVChannels()); - for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) { aiVector3D v = scene->mMeshes[0]->mVertices[i]; aiVector3D n = scene->mMeshes[0]->mNormals[i]; + aiVector3D t = scene->mMeshes[0]->mTextureCoords[0][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(n.x); + result.vertices.push_back(n.y); + result.vertices.push_back(n.z); + result.vertices.push_back(t.x); + result.vertices.push_back(t.y); } for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) { @@ -391,10 +384,9 @@ int main() { if (glewInit() != GLEW_OK) { } - GLuint shaderProgramShadowmap = compileShaders("shaders/vert_shadowmap.glsl", "shaders/frag_shadowmap.glsl"); - GLuint shaderProgramIrradiance = compileShaders("shaders/vert_irradiance.glsl", "shaders/frag_irradiance.glsl"); + GLuint shaderProgramIrradiance = compileShaders("shaders/ts_vert_irradiance.glsl", "shaders/ts_frag_irradiance.glsl"); + GLuint shaderProgramCombine = compileShaders("shaders/ts_vert.glsl", "shaders/ts_frag.glsl"); - //model m = loadModel("models/Isotrop-upperjaw.ply"); model m = loadModel("models/african_head/african_head.obj"); arccam arcCam; @@ -418,12 +410,12 @@ int main() { const struct { bool wireframe = false; bool freecam = false; - int renderState = 2; + int renderState = 1; float color[3] = { 0.7f, 0.4f, 0.4f }; - glm::vec3 lightPos = glm::vec3(0.0f, 0.04f, -0.08f); + glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 2.5f); float transmittanceScale = 0.005f; - float powBase = 2.718; - float powFactor = 1; + float powBase = 2; + float powFactor = 1.5; } DefaultOptions; auto options = DefaultOptions; @@ -481,13 +473,9 @@ int main() { prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right); - // Render Shadowmap - - glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); - glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); - glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); + // Render Shadowmap to fbo - glBindFramebuffer(GL_FRAMEBUFFER, fb_shadowmap.fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); @@ -497,34 +485,41 @@ int main() { else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glUseProgram(shaderProgramShadowmap); + glUseProgram(shaderProgramIrradiance); if (options.freecam) view = freeCam.getViewMatrix(); else view = arcCam.getViewMatrix(); - lightView = glm::lookAt(options.lightPos, glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); - glUniformMatrix4fv( - glGetUniformLocation(shaderProgramShadowmap, "model"), + glGetUniformLocation(shaderProgramIrradiance, "model"), 1, GL_FALSE, glm::value_ptr(model)); glUniformMatrix4fv( - glGetUniformLocation(shaderProgramShadowmap, "lightView"), - 1, GL_FALSE, glm::value_ptr(lightView)); + glGetUniformLocation(shaderProgramIrradiance, "view"), + 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv( - glGetUniformLocation(shaderProgramShadowmap, "projection"), - 1, GL_FALSE, glm::value_ptr(lightProj)); + glGetUniformLocation(shaderProgramIrradiance, "projection"), + 1, GL_FALSE, glm::value_ptr(proj)); glUniform3fv( - glGetUniformLocation(shaderProgramShadowmap, "lightPos"), + glGetUniformLocation(shaderProgramIrradiance, "objectColor"), + 1, options.color); + glUniform3f( + glGetUniformLocation(shaderProgramIrradiance, "lightColor"), + 1.0f, 1.0f, 1.0f); + glUniform3fv( + glGetUniformLocation(shaderProgramIrradiance, "lightPos"), 1, glm::value_ptr(options.lightPos)); + glUniform3fv( + glGetUniformLocation(shaderProgramIrradiance, "viewPos"), + 1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos())); m.draw(); - // Render irradiance + // Render model and calculate light spread and translucency in shader - glBindFramebuffer(GL_FRAMEBUFFER, fb_irradiance.fbo); + glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); @@ -534,99 +529,58 @@ int main() { else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glUseProgram(shaderProgramIrradiance); + glUseProgram(shaderProgramCombine); + + if (options.freecam) + view = freeCam.getViewMatrix(); + else + view = arcCam.getViewMatrix(); glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "model"), + glGetUniformLocation(shaderProgramCombine, "model"), 1, GL_FALSE, glm::value_ptr(model)); glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "view"), + glGetUniformLocation(shaderProgramCombine, "view"), 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "lightView"), - 1, GL_FALSE, glm::value_ptr(lightView)); - glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "lightViewInv"), - 1, GL_FALSE, glm::value_ptr(glm::inverse(lightView))); - glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "projection"), + glGetUniformLocation(shaderProgramCombine, "projection"), 1, GL_FALSE, glm::value_ptr(proj)); - glUniformMatrix4fv( - glGetUniformLocation(shaderProgramIrradiance, "lightProjection"), - 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); - glUniform3fv(glGetUniformLocation(shaderProgramIrradiance, "sampleWeights"), 13, sampleWeights); - - glUniform1f( - glGetUniformLocation(shaderProgramIrradiance, "transmittanceScale"), - options.transmittanceScale); - glUniform1i( - glGetUniformLocation(shaderProgramIrradiance, "renderState"), - options.renderState); - glUniform1f( - glGetUniformLocation(shaderProgramIrradiance, "powBase"), - options.powBase); - glUniform1f( - glGetUniformLocation(shaderProgramIrradiance, "powFactor"), - options.powFactor); glUniform3fv( - glGetUniformLocation(shaderProgramIrradiance, "objectColor"), + glGetUniformLocation(shaderProgramCombine, "objectColor"), 1, options.color); glUniform3f( - glGetUniformLocation(shaderProgramIrradiance, "lightColor"), + glGetUniformLocation(shaderProgramCombine, "lightColor"), 1.0f, 1.0f, 1.0f); glUniform3fv( - glGetUniformLocation(shaderProgramIrradiance, "lightPos"), + glGetUniformLocation(shaderProgramCombine, "lightPos"), 1, glm::value_ptr(options.lightPos)); glUniform3fv( - glGetUniformLocation(shaderProgramIrradiance, "viewPos"), + glGetUniformLocation(shaderProgramCombine, "viewPos"), 1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos())); + + glUniform1i(glGetUniformLocation(shaderProgramCombine, "screenWidth"), window.getSize().x); + glUniform1i(glGetUniformLocation(shaderProgramCombine, "screenHeight"), window.getSize().y); + glUniform1i(glGetUniformLocation(shaderProgramCombine, "renderState"), options.renderState); + glUniform2fv(glGetUniformLocation(shaderProgramCombine, "samplePositions"), 13, samplePositions); + glUniform3fv(glGetUniformLocation(shaderProgramCombine, "sampleWeights"), 13, sampleWeights); + glUniform1f(glGetUniformLocation(shaderProgramCombine, "transmittanceScale"), options.transmittanceScale); - glUniform1i(glGetUniformLocation(shaderProgramIrradiance, "shadowmapTexture"), 0); + glUniform1i(glGetUniformLocation(shaderProgramCombine, "irradianceTexture"), 0); glActiveTexture(GL_TEXTURE0 + 0); - glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture); + glBindTexture(GL_TEXTURE_2D, fb_irradiance.renderTexture); m.draw(); - // Render fbo to screen - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glDisable(GL_DEPTH_TEST); - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glUseProgram(fb_irradiance.screenShaderProgram); - - glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "screenWidth"), window.getSize().x); - glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "screenHeight"), window.getSize().y); - glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "renderState"), options.renderState); - glUniform2fv(glGetUniformLocation(fb_irradiance.screenShaderProgram, "samplePositions"), 13, samplePositions); - glUniform3fv(glGetUniformLocation(fb_irradiance.screenShaderProgram, "sampleWeights"), 13, sampleWeights); - - glBindVertexArray(fb_irradiance.screenVAO); - glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "shadowmapTexture"), 0); - glUniform1i(glGetUniformLocation(fb_irradiance.screenShaderProgram, "irradianceTexture"), 1); - glActiveTexture(GL_TEXTURE0 + 0); - glBindTexture(GL_TEXTURE_2D, fb_shadowmap.renderTexture); - glActiveTexture(GL_TEXTURE0 + 1); - glBindTexture(GL_TEXTURE_2D, fb_irradiance.renderTexture); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); + // menu ImGui::SFML::Update(window, deltaClock.restart()); ImGui::Begin("Options"); ImGui::Checkbox("Wireframe", &options.wireframe); ImGui::Checkbox("Free Cam", &options.freecam); - 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);