From: Patrick Schönberger Date: Wed, 13 Jan 2021 10:54:30 +0000 (+0100) Subject: no lighting X-Git-Url: https://gitweb.ps.run/subsurface_scattering/commitdiff_plain/357464ac8bd3bd04d886460b5ec1720520d22460?ds=inline no lighting --- 357464ac8bd3bd04d886460b5ec1720520d22460 diff --git a/build.cmd b/build.cmd new file mode 100644 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 index 0000000..1b59749 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,214 @@ +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + + +const char *vertexShaderSource = +"#version 330 core\n" +"layout (location = 0) in vec3 pos;\n" +"uniform mat4 model;\n" +"uniform mat4 view;\n" +"uniform mat4 projection;\n" +"\n" +"void main()\n" +"{\n" +" gl_Position = projection * view * model * vec4(pos, 1.0);\n" +"}\n"; + +const char *fragmentShaderSource = +"#version 330 core\n" +"out vec4 FragColor;\n" +"\n" +"void main()\n" +"{\n" +" FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n" +"}\n"; + +std::vector vertices; +std::vector indices; + + +void load(const std::string &filename, std::vector &vertices, std::vector &indices) { + Assimp::Importer importer; + + const aiScene *scene = importer.ReadFile( + filename, + aiProcess_CalcTangentSpace | + aiProcess_Triangulate | + aiProcess_JoinIdenticalVertices | + aiProcess_SortByPType + ); + + for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) { + aiVector3D v = scene->mMeshes[0]->mVertices[i]; + vertices.push_back(v.x); + vertices.push_back(v.y); + vertices.push_back(v.z); + } + + for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) { + aiFace f = scene->mMeshes[0]->mFaces[i]; + for (int j = 0; j < f.mNumIndices; j++) { + indices.push_back(f.mIndices[j]); + } + } +} + +int main() { + // Window Setup + + sf::ContextSettings settings; + settings.depthBits = 24; + settings.antialiasingLevel = 0; + settings.majorVersion = 4; + settings.minorVersion = 6; + + sf::Window window(sf::VideoMode(800, 600), "Subsurface Scattering", + sf::Style::Default, settings); + window.setVerticalSyncEnabled(true); + + window.setActive(true); + + // Initialize GLEW + + if (glewInit() != GLEW_OK) { + + } + + load("models/Isotrop-upperjaw.ply", vertices, indices); + + // Compile Shaders + + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + printf("Error compiling vertex shader: %s\n", infoLog); + } + + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + printf("Error compiling fragment shader: %s\n", infoLog); + } + + // Link Shader Program + + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + printf("Error linking shader program: %s\n", infoLog); + } + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + // Create VBO + + GLuint VBO; + glGenBuffers(1, &VBO); + + // Create EBO + + GLuint EBO; + glGenBuffers(1, &EBO); + + // Create VAO + + GLuint VAO; + glGenVertexArrays(1, &VAO); + + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL); + glEnableVertexAttribArray(0); + + glBindVertexArray(0); + + // Perspective + + glm::mat4 model = glm::mat4(1.0f); + + glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -200.0f)); + + glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f); + + bool wireframe = false; + + bool running = true; + while (running) { + sf::Event event; + while (window.pollEvent(event)) { + if (event.type == sf::Event::Closed) { + running = false; + } else if (event.type == sf::Event::Resized) { + glViewport(0, 0, event.size.width, event.size.height); + } else if (event.type == sf::Event::KeyReleased) { + using keys = sf::Keyboard; + switch (event.key.code) { + case keys::W: + wireframe = !wireframe; + break; + case keys::Escape: + running = false; + break; + } + } + } + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_DEPTH_TEST); + + if (wireframe) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + else + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f)); + + glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(proj)); + + glUseProgram(shaderProgram); + glBindVertexArray(VAO); + glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0); + glBindVertexArray(0); + + window.display(); + } + + return 0; +} \ No newline at end of file