/*\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
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
float moveFactor = 20;\r
};\r
\r
-\r
struct arccam {\r
glm::vec2 rot = glm::vec2(0, 0);\r
float radius = 1;\r
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
\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
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
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
-\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
+\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
// 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.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
\r
sf::Clock deltaClock;\r
\r
}\r
}\r
\r
- // Update\r
+ // Update Camera\r
\r
if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) {\r
window.setMouseCursorVisible(false);\r
\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
+ 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
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
- // 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
\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
+ glUniform1fv(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
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
\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
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
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::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
if (ImGui::Button("Reset")) {\r
arcCam.rot = glm::vec2(0);\r
arcCam.radius = 1;\r
+ options = DefaultOptions;\r
}\r
}\r
ImGui::End();\r
}\r
\r
return 0;\r
-}
\ No newline at end of file
+}\r