treesummaryrefslogcommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp107
1 files changed, 75 insertions, 32 deletions
diff --git a/src/main.cpp b/src/main.cpp
index dde29ec..24a39cc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -23,8 +23,13 @@
/*
TODO:
-- ShadowMap to fbo
- 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
*/
@@ -101,7 +106,6 @@ private:
GLuint VAO = 0;
};
-
struct freecam {
glm::vec3 pos = glm::vec3(0, 0, -1);
glm::vec2 rot = glm::vec2(0, 0);
@@ -155,7 +159,6 @@ private:
float moveFactor = 20;
};
-
struct arccam {
glm::vec2 rot = glm::vec2(0, 0);
float radius = 1;
@@ -207,7 +210,6 @@ private:
const float angleFactor = 200;
};
-
std::string readFile(std::string filename) {
std::ifstream ifs(filename, std::ios::binary);
std::string result, line;
@@ -222,19 +224,22 @@ model loadModel(const std::string &filename) {
const aiScene *scene = importer.ReadFile(
filename, aiProcess_CalcTangentSpace | aiProcess_Triangulate |
- aiProcess_SortByPType | aiProcess_GenSmoothNormals);
+ aiProcess_SortByPType | aiProcess_GenSmoothNormals |
+ aiProcess_GenUVCoords);
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];
- 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);
+ 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);
}
for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {
@@ -293,7 +298,6 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
return shaderProgram;
}
-
struct framebuffer {
framebuffer(const char *vertFilename, const char *fragFilename, int width, int height) {
glGenFramebuffers(1, &fbo);
@@ -387,23 +391,23 @@ int main() {
if (glewInit() != GLEW_OK) {
}
- GLuint shaderProgramShadowmap = compileShaders("shaders/vert.glsl", "shaders/frag_shadowmap.glsl");
- GLuint shaderProgramIrradiance = compileShaders("shaders/vert.glsl", "shaders/frag_irradiance.glsl");
+ 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/Isotrop-upperjaw.ply");
+ model m = loadModel("models/african_head/african_head.obj");
arccam arcCam;
freecam freeCam;
-
- glm::vec3 lightPos(1.2f, 5.0f, 2.0f);
// MVP
glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f));
- glm::mat4 view;
+ glm::mat4 view, lightView;
glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);
+ 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);
@@ -411,12 +415,18 @@ int main() {
// Config
- struct {
+ const struct {
bool wireframe = false;
bool freecam = false;
- int renderState = 0;
+ int renderState = 2;
float color[3] = { 0.7f, 0.4f, 0.4f };
- } options;
+ glm::vec3 lightPos = glm::vec3(0.0f, 0.04f, -0.08f);
+ float transmittanceScale = 0.005f;
+ float powBase = 2.718;
+ float powFactor = 1;
+ } DefaultOptions;
+
+ auto options = DefaultOptions;
sf::Clock deltaClock;
@@ -473,6 +483,10 @@ int main() {
// Render Shadowmap
+ glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE);
+ glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);
+ glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
+
glBindFramebuffer(GL_FRAMEBUFFER, fb_shadowmap.fbo);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -490,19 +504,21 @@ int main() {
else
view = arcCam.getViewMatrix();
+ lightView = glm::lookAt(options.lightPos, glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
+
glUniformMatrix4fv(
glGetUniformLocation(shaderProgramShadowmap, "model"),
1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(
- glGetUniformLocation(shaderProgramShadowmap, "view"),
- 1, GL_FALSE, glm::value_ptr(view));
+ glGetUniformLocation(shaderProgramShadowmap, "lightView"),
+ 1, GL_FALSE, glm::value_ptr(lightView));
glUniformMatrix4fv(
glGetUniformLocation(shaderProgramShadowmap, "projection"),
- 1, GL_FALSE, glm::value_ptr(proj));
+ 1, GL_FALSE, glm::value_ptr(lightProj));
glUniform3fv(
glGetUniformLocation(shaderProgramShadowmap, "lightPos"),
- 1, glm::value_ptr(lightPos));
+ 1, glm::value_ptr(options.lightPos));
m.draw();
@@ -520,11 +536,6 @@ int main() {
glUseProgram(shaderProgramIrradiance);
- if (options.freecam)
- view = freeCam.getViewMatrix();
- else
- view = arcCam.getViewMatrix();
-
glUniformMatrix4fv(
glGetUniformLocation(shaderProgramIrradiance, "model"),
1, GL_FALSE, glm::value_ptr(model));
@@ -532,8 +543,34 @@ int main() {
glGetUniformLocation(shaderProgramIrradiance, "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"),
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"),
@@ -543,7 +580,7 @@ int main() {
1.0f, 1.0f, 1.0f);
glUniform3fv(
glGetUniformLocation(shaderProgramIrradiance, "lightPos"),
- 1, glm::value_ptr(lightPos));
+ 1, glm::value_ptr(options.lightPos));
glUniform3fv(
glGetUniformLocation(shaderProgramIrradiance, "viewPos"),
1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));
@@ -586,13 +623,18 @@ int main() {
ImGui::Checkbox("Wireframe", &options.wireframe);
ImGui::Checkbox("Free Cam", &options.freecam);
ImGui::InputInt("Render State", &options.renderState);
- ImGui::InputFloat3("Color", options.color, 2);
+ 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);
ImGui::LabelText("Rotation", "%f %f", freeCam.rot.x, freeCam.rot.y);
if (ImGui::Button("Reset")) {
freeCam.pos = glm::vec3(0, 0, -1);
freeCam.rot = glm::vec2(0);
+ options = DefaultOptions;
}
} else {
ImGui::LabelText("Rotation", "%f %f", arcCam.rot.x, arcCam.rot.y);
@@ -600,6 +642,7 @@ int main() {
if (ImGui::Button("Reset")) {
arcCam.rot = glm::vec2(0);
arcCam.radius = 1;
+ options = DefaultOptions;
}
}
ImGui::End();