]> gitweb.ps.run Git - subsurface_scattering/blobdiff - src/main.cpp
yes lighting
[subsurface_scattering] / src / main.cpp
index 1b59749c253f1e0faec5928359f855a74b9c5428..8bdede62d035eab9802e464c63e55c5048a1c27e 100644 (file)
 #include <SFML/Window.hpp>\r
 \r
 #include <assimp/Importer.hpp>\r
-#include <assimp/scene.h>\r
 #include <assimp/postprocess.h>\r
+#include <assimp/scene.h>\r
+\r
+const char *vertexShaderSource = R"(\r
+#version 330 core\r
+\r
+layout (location = 0) in vec3 pos;\r
+layout (location = 0) in vec3 normal;\r
+\r
+out vec3 FragPos;\r
+out vec3 Normal;\r
+\r
+uniform mat4 model;\r
+uniform mat4 view;\r
+uniform mat4 projection;\r
+\r
+void main()\r
+{\r
+  gl_Position = projection * view * model * vec4(pos, 1.0);\r
+  FragPos = vec3(model * vec4(pos, 1));\r
+  Normal = normal;\r
+}\r
+)";\r
+\r
+const char *fragmentShaderSource = R"(\r
+#version 330 core\r
+\r
+in vec3 FragPos;\r
+in vec3 Normal;\r
+\r
+out vec4 FragColor;\r
+\r
+uniform vec3 objectColor;\r
+uniform vec3 lightColor;\r
+uniform vec3 lightPos;\r
 \r
+void main()\r
+{\r
+  vec3 norm = normalize(Normal);\r
+  vec3 lightDir = normalize(lightPos - FragPos);\r
 \r
-const char *vertexShaderSource =\r
-"#version 330 core\n"\r
-"layout (location = 0) in vec3 pos;\n"\r
-"uniform mat4 model;\n"\r
-"uniform mat4 view;\n"\r
-"uniform mat4 projection;\n"\r
-"\n"\r
-"void main()\n"\r
-"{\n"\r
-"    gl_Position = projection * view * model * vec4(pos, 1.0);\n"\r
-"}\n";\r
-\r
-const char *fragmentShaderSource =\r
-"#version 330 core\n"\r
-"out vec4 FragColor;\n"\r
-"\n"\r
-"void main()\n"\r
-"{\n"\r
-"    FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"\r
-"}\n";\r
+  float diff = max(dot(norm, lightDir), 0.0);\r
+  vec3 diffuse = diff * lightColor;\r
+\r
+  float ambientStrength = 0.1;\r
+  vec3 ambient = ambientStrength * lightColor;\r
+\r
+  vec3 result = (ambient + diffuse) * objectColor;\r
+  FragColor = vec4(result, 1.0f);\r
+}\r
+)";\r
 \r
 std::vector<float> vertices;\r
 std::vector<GLuint> indices;\r
 \r
+glm::vec3 lightPos(1.2f, 0.5f, 2.0f);\r
 \r
-void load(const std::string &filename, std::vector<float> &vertices, std::vector<GLuint> &indices) {\r
+void load(const std::string &filename, std::vector<float> &vertices,\r
+          std::vector<GLuint> &indices) {\r
   Assimp::Importer importer;\r
 \r
   const aiScene *scene = importer.ReadFile(\r
-      filename,\r
-      aiProcess_CalcTangentSpace |\r
-      aiProcess_Triangulate |\r
-      aiProcess_JoinIdenticalVertices |\r
-      aiProcess_SortByPType\r
-  );\r
+      filename, aiProcess_CalcTangentSpace | aiProcess_Triangulate |\r
+                    aiProcess_SortByPType | aiProcess_GenNormals);\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
     vertices.push_back(v.x);\r
     vertices.push_back(v.y);\r
     vertices.push_back(v.z);\r
+    vertices.push_back(n.x);\r
+    vertices.push_back(n.y);\r
+    vertices.push_back(n.z);\r
   }\r
 \r
   for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
@@ -83,7 +112,6 @@ int main() {
   // Initialize GLEW\r
 \r
   if (glewInit() != GLEW_OK) {\r
-\r
   }\r
 \r
   load("models/Isotrop-upperjaw.ply", vertices, indices);\r
@@ -94,12 +122,12 @@ int main() {
   glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);\r
   glCompileShader(vertexShader);\r
 \r
-  int  success;\r
+  int success;\r
   char infoLog[512];\r
   glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
-      glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);\r
-      printf("Error compiling vertex shader: %s\n", infoLog);\r
+    glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);\r
+    printf("Error compiling vertex shader: %s\n", infoLog);\r
   }\r
 \r
   GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);\r
@@ -108,8 +136,8 @@ int main() {
 \r
   glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
-      glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);\r
-      printf("Error compiling fragment shader: %s\n", infoLog);\r
+    glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);\r
+    printf("Error compiling fragment shader: %s\n", infoLog);\r
   }\r
 \r
   // Link Shader Program\r
@@ -118,11 +146,11 @@ int main() {
   glAttachShader(shaderProgram, vertexShader);\r
   glAttachShader(shaderProgram, fragmentShader);\r
   glLinkProgram(shaderProgram);\r
-  \r
+\r
   glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);\r
   if (!success) {\r
-      glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);\r
-      printf("Error linking shader program: %s\n", infoLog);\r
+    glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);\r
+    printf("Error linking shader program: %s\n", infoLog);\r
   }\r
 \r
   glDeleteShader(vertexShader);\r
@@ -137,32 +165,37 @@ int main() {
 \r
   GLuint EBO;\r
   glGenBuffers(1, &EBO);\r
-  \r
+\r
   // Create VAO\r
 \r
   GLuint VAO;\r
   glGenVertexArrays(1, &VAO);\r
 \r
   glBindVertexArray(VAO);\r
-  \r
+\r
   glBindBuffer(GL_ARRAY_BUFFER, VBO);\r
-  glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);\r
-  \r
+  glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(),\r
+               vertices.data(), GL_STATIC_DRAW);\r
+\r
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);\r
-  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW);\r
+  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),\r
+               indices.data(), GL_STATIC_DRAW);\r
 \r
-  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL);\r
+  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)0);\r
+  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)3);\r
   glEnableVertexAttribArray(0);\r
 \r
   glBindVertexArray(0);\r
 \r
   // Perspective\r
 \r
-  glm::mat4 model = glm::mat4(1.0f);\r
+  glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f));\r
 \r
-  glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -200.0f));\r
+  glm::mat4 view =\r
+      glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -3.0f));\r
 \r
-  glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);\r
+  glm::mat4 proj =\r
+      glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);\r
 \r
   bool wireframe = false;\r
 \r
@@ -196,13 +229,23 @@ int main() {
     else\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
+    glUseProgram(shaderProgram);\r
+\r
     model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f));\r
 \r
-    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model));\r
-    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));\r
-    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(proj));\r
+    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1,\r
+                       GL_FALSE, glm::value_ptr(model));\r
+    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE,\r
+                       glm::value_ptr(view));\r
+    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1,\r
+                       GL_FALSE, glm::value_ptr(proj));\r
+\r
+    glUniform3f(glGetUniformLocation(shaderProgram, "objectColor"), 1.0f, 0.5f,\r
+                0.31f);\r
+    glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f, 1.0f,\r
+                1.0f);\r
+    glUniform3fv(glGetUniformLocation(shaderProgram, "lightPos"), 1, glm::value_ptr(lightPos));\r
 \r
-    glUseProgram(shaderProgram);\r
     glBindVertexArray(VAO);\r
     glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\r
     glBindVertexArray(0);\r