]> gitweb.ps.run Git - subsurface_scattering/commitdiff
no lighting
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 13 Jan 2021 10:54:30 +0000 (11:54 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 13 Jan 2021 10:54:30 +0000 (11:54 +0100)
build.cmd [new file with mode: 0644]
src/main.cpp [new file with mode: 0644]

diff --git a/build.cmd b/build.cmd
new file mode 100644 (file)
index 0000000..00eecad
--- /dev/null
+++ b/build.cmd
@@ -0,0 +1 @@
+cl src/main.cpp /EHsc /I C:/prg/cpp/libs/SFML-2.5.1/include /I C:/prg/cpp/libs/assimp-5.0.1/include /I C:/prg/cpp/libs/assimp-5.0.1/build/include /I C:/prg/cpp/libs/glew-2.1.0/include /I C:/prg/cpp/libs/glm /link /LIBPATH:"C:/prg/cpp/libs/SFML-2.5.1/build/lib/Release" /LIBPATH:"C:/prg/cpp/libs/assimp-5.0.1/build/code/Release" /LIBPATH:"C:/prg/cpp/libs/glew-2.1.0/lib/Release/x64" sfml-system.lib sfml-window.lib sfml-graphics.lib glew32.lib opengl32.lib assimp-vc142-mt.lib
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644 (file)
index 0000000..1b59749
--- /dev/null
@@ -0,0 +1,214 @@
+#include <stdio.h>\r
+\r
+#include <GL/glew.h>\r
+\r
+#include <glm/glm.hpp>\r
+#include <glm/gtc/matrix_transform.hpp>\r
+#include <glm/gtc/type_ptr.hpp>\r
+\r
+#include <SFML/OpenGL.hpp>\r
+#include <SFML/Window.hpp>\r
+\r
+#include <assimp/Importer.hpp>\r
+#include <assimp/scene.h>\r
+#include <assimp/postprocess.h>\r
+\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
+\r
+std::vector<float> vertices;\r
+std::vector<GLuint> indices;\r
+\r
+\r
+void load(const std::string &filename, std::vector<float> &vertices, 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
+\r
+  for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) {\r
+    aiVector3D v = scene->mMeshes[0]->mVertices[i];\r
+    vertices.push_back(v.x);\r
+    vertices.push_back(v.y);\r
+    vertices.push_back(v.z);\r
+  }\r
+\r
+  for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
+    aiFace f = scene->mMeshes[0]->mFaces[i];\r
+    for (int j = 0; j < f.mNumIndices; j++) {\r
+      indices.push_back(f.mIndices[j]);\r
+    }\r
+  }\r
+}\r
+\r
+int main() {\r
+  // Window Setup\r
+\r
+  sf::ContextSettings settings;\r
+  settings.depthBits = 24;\r
+  settings.antialiasingLevel = 0;\r
+  settings.majorVersion = 4;\r
+  settings.minorVersion = 6;\r
+\r
+  sf::Window window(sf::VideoMode(800, 600), "Subsurface Scattering",\r
+                    sf::Style::Default, settings);\r
+  window.setVerticalSyncEnabled(true);\r
+\r
+  window.setActive(true);\r
+\r
+  // Initialize GLEW\r
+\r
+  if (glewInit() != GLEW_OK) {\r
+\r
+  }\r
+\r
+  load("models/Isotrop-upperjaw.ply", vertices, indices);\r
+\r
+  // Compile Shaders\r
+\r
+  GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);\r
+  glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);\r
+  glCompileShader(vertexShader);\r
+\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
+  }\r
+\r
+  GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);\r
+  glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);\r
+  glCompileShader(fragmentShader);\r
+\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
+  }\r
+\r
+  // Link Shader Program\r
+\r
+  GLuint shaderProgram = glCreateProgram();\r
+  glAttachShader(shaderProgram, vertexShader);\r
+  glAttachShader(shaderProgram, fragmentShader);\r
+  glLinkProgram(shaderProgram);\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
+  }\r
+\r
+  glDeleteShader(vertexShader);\r
+  glDeleteShader(fragmentShader);\r
+\r
+  // Create VBO\r
+\r
+  GLuint VBO;\r
+  glGenBuffers(1, &VBO);\r
+\r
+  // Create EBO\r
+\r
+  GLuint EBO;\r
+  glGenBuffers(1, &EBO);\r
+  \r
+  // Create VAO\r
+\r
+  GLuint VAO;\r
+  glGenVertexArrays(1, &VAO);\r
+\r
+  glBindVertexArray(VAO);\r
+  \r
+  glBindBuffer(GL_ARRAY_BUFFER, VBO);\r
+  glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), 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
+\r
+  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL);\r
+  glEnableVertexAttribArray(0);\r
+\r
+  glBindVertexArray(0);\r
+\r
+  // Perspective\r
+\r
+  glm::mat4 model = glm::mat4(1.0f);\r
+\r
+  glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -200.0f));\r
+\r
+  glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);\r
+\r
+  bool wireframe = false;\r
+\r
+  bool running = true;\r
+  while (running) {\r
+    sf::Event event;\r
+    while (window.pollEvent(event)) {\r
+      if (event.type == sf::Event::Closed) {\r
+        running = false;\r
+      } else if (event.type == sf::Event::Resized) {\r
+        glViewport(0, 0, event.size.width, event.size.height);\r
+      } else if (event.type == sf::Event::KeyReleased) {\r
+        using keys = sf::Keyboard;\r
+        switch (event.key.code) {\r
+        case keys::W:\r
+          wireframe = !wireframe;\r
+          break;\r
+        case keys::Escape:\r
+          running = false;\r
+          break;\r
+        }\r
+      }\r
+    }\r
+\r
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
+\r
+    glEnable(GL_DEPTH_TEST);\r
+\r
+    if (wireframe)\r
+      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\r
+    else\r
+      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\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
+\r
+    glUseProgram(shaderProgram);\r
+    glBindVertexArray(VAO);\r
+    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\r
+    glBindVertexArray(0);\r
+\r
+    window.display();\r
+  }\r
+\r
+  return 0;\r
+}
\ No newline at end of file