5 #include <glm/glm.hpp>
\r
6 #include <glm/gtc/matrix_transform.hpp>
\r
7 #include <glm/gtc/type_ptr.hpp>
\r
9 #include <SFML/OpenGL.hpp>
\r
10 #include <SFML/Window.hpp>
\r
12 #include <assimp/Importer.hpp>
\r
13 #include <assimp/scene.h>
\r
14 #include <assimp/postprocess.h>
\r
17 const char *vertexShaderSource =
\r
18 "#version 330 core\n"
\r
19 "layout (location = 0) in vec3 pos;\n"
\r
20 "uniform mat4 model;\n"
\r
21 "uniform mat4 view;\n"
\r
22 "uniform mat4 projection;\n"
\r
26 " gl_Position = projection * view * model * vec4(pos, 1.0);\n"
\r
29 const char *fragmentShaderSource =
\r
30 "#version 330 core\n"
\r
31 "out vec4 FragColor;\n"
\r
35 " FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"
\r
38 std::vector<float> vertices;
\r
39 std::vector<GLuint> indices;
\r
42 void load(const std::string &filename, std::vector<float> &vertices, std::vector<GLuint> &indices) {
\r
43 Assimp::Importer importer;
\r
45 const aiScene *scene = importer.ReadFile(
\r
47 aiProcess_CalcTangentSpace |
\r
48 aiProcess_Triangulate |
\r
49 aiProcess_JoinIdenticalVertices |
\r
50 aiProcess_SortByPType
\r
53 for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) {
\r
54 aiVector3D v = scene->mMeshes[0]->mVertices[i];
\r
55 vertices.push_back(v.x);
\r
56 vertices.push_back(v.y);
\r
57 vertices.push_back(v.z);
\r
60 for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {
\r
61 aiFace f = scene->mMeshes[0]->mFaces[i];
\r
62 for (int j = 0; j < f.mNumIndices; j++) {
\r
63 indices.push_back(f.mIndices[j]);
\r
71 sf::ContextSettings settings;
\r
72 settings.depthBits = 24;
\r
73 settings.antialiasingLevel = 0;
\r
74 settings.majorVersion = 4;
\r
75 settings.minorVersion = 6;
\r
77 sf::Window window(sf::VideoMode(800, 600), "Subsurface Scattering",
\r
78 sf::Style::Default, settings);
\r
79 window.setVerticalSyncEnabled(true);
\r
81 window.setActive(true);
\r
85 if (glewInit() != GLEW_OK) {
\r
89 load("models/Isotrop-upperjaw.ply", vertices, indices);
\r
93 GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
\r
94 glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
\r
95 glCompileShader(vertexShader);
\r
99 glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
\r
101 glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
\r
102 printf("Error compiling vertex shader: %s\n", infoLog);
\r
105 GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
\r
106 glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
\r
107 glCompileShader(fragmentShader);
\r
109 glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
\r
111 glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
\r
112 printf("Error compiling fragment shader: %s\n", infoLog);
\r
115 // Link Shader Program
\r
117 GLuint shaderProgram = glCreateProgram();
\r
118 glAttachShader(shaderProgram, vertexShader);
\r
119 glAttachShader(shaderProgram, fragmentShader);
\r
120 glLinkProgram(shaderProgram);
\r
122 glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
\r
124 glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
\r
125 printf("Error linking shader program: %s\n", infoLog);
\r
128 glDeleteShader(vertexShader);
\r
129 glDeleteShader(fragmentShader);
\r
134 glGenBuffers(1, &VBO);
\r
139 glGenBuffers(1, &EBO);
\r
144 glGenVertexArrays(1, &VAO);
\r
146 glBindVertexArray(VAO);
\r
148 glBindBuffer(GL_ARRAY_BUFFER, VBO);
\r
149 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
\r
151 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
\r
152 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW);
\r
154 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL);
\r
155 glEnableVertexAttribArray(0);
\r
157 glBindVertexArray(0);
\r
161 glm::mat4 model = glm::mat4(1.0f);
\r
163 glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -200.0f));
\r
165 glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);
\r
167 bool wireframe = false;
\r
169 bool running = true;
\r
172 while (window.pollEvent(event)) {
\r
173 if (event.type == sf::Event::Closed) {
\r
175 } else if (event.type == sf::Event::Resized) {
\r
176 glViewport(0, 0, event.size.width, event.size.height);
\r
177 } else if (event.type == sf::Event::KeyReleased) {
\r
178 using keys = sf::Keyboard;
\r
179 switch (event.key.code) {
\r
181 wireframe = !wireframe;
\r
190 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
\r
192 glEnable(GL_DEPTH_TEST);
\r
195 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
\r
197 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
\r
199 model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f));
\r
201 glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model));
\r
202 glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));
\r
203 glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(proj));
\r
205 glUseProgram(shaderProgram);
\r
206 glBindVertexArray(VAO);
\r
207 glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
\r
208 glBindVertexArray(0);
\r