]> gitweb.ps.run Git - subsurface_scattering/commitdiff
render to framebufer
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Tue, 2 Feb 2021 22:18:31 +0000 (23:18 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Tue, 2 Feb 2021 22:18:31 +0000 (23:18 +0100)
shaders/fbo_frag.glsl [new file with mode: 0644]
shaders/fbo_vert.glsl [new file with mode: 0644]
shaders/frag.glsl
shaders/vert.glsl
src/main.cpp

diff --git a/shaders/fbo_frag.glsl b/shaders/fbo_frag.glsl
new file mode 100644 (file)
index 0000000..cf1fafa
--- /dev/null
@@ -0,0 +1,13 @@
+#version 330 core\r
+out vec4 FragColor;\r
+  \r
+in vec2 TexCoords;\r
+\r
+uniform sampler2D screenTexture;\r
+\r
+void main()\r
+{ \r
+    FragColor = vec4(\r
+        texture(screenTexture, TexCoords).rgb,\r
+        1.0);\r
+}\r
diff --git a/shaders/fbo_vert.glsl b/shaders/fbo_vert.glsl
new file mode 100644 (file)
index 0000000..fb80df5
--- /dev/null
@@ -0,0 +1,11 @@
+#version 330 core\r
+layout (location = 0) in vec2 aPos;\r
+layout (location = 1) in vec2 aTexCoords;\r
+\r
+out vec2 TexCoords;\r
+\r
+void main()\r
+{\r
+    gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); \r
+    TexCoords = aTexCoords;\r
+}\r
index a92699c8dba003d7ba2fccbeb7f3a51fe9045fd0..a70915a49e8abd03e8b9b6493f978b5b3ad5b5e3 100644 (file)
@@ -8,6 +8,7 @@ out vec4 FragColor;
 uniform vec3 objectColor;\r
 uniform vec3 lightColor;\r
 uniform vec3 lightPos;\r
+uniform vec3 viewPos;\r
 \r
 void main()\r
 {\r
@@ -20,6 +21,12 @@ void main()
   float ambientStrength = 0.1;\r
   vec3 ambient = ambientStrength * lightColor;\r
 \r
-  vec3 result = (ambient + diffuse) * objectColor;\r
+  float specularStrength = 0.5;\r
+  vec3 viewDir = normalize(viewPos - FragPos);\r
+  vec3 reflectDir = reflect(-lightDir, norm);\r
+  float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);\r
+  vec3 specular = specularStrength * spec * lightColor;\r
+\r
+  vec3 result = (ambient + diffuse + specular) * objectColor;\r
   FragColor = vec4(result, 1.0f);\r
-}
\ No newline at end of file
+}\r
index fc3721a60b48cade5e3fc7829286fb6ed220ed06..6f485734d62eab44c88ed1c2e6650ebb2006958d 100644 (file)
@@ -15,4 +15,4 @@ void main()
   gl_Position = projection * view * model * vec4(pos, 1.0);\r
   FragPos = vec3(model * vec4(pos, 1));\r
   Normal = normal;\r
-}
\ No newline at end of file
+}\r
index c05d25eccf40e4e12d659c1e2b427e74a8adb381..41d5e76ea9db2cf5da6797c057d77c3c10662a45 100644 (file)
@@ -51,10 +51,10 @@ private:
     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) * 6, (void*)(0));\r
     glEnableVertexAttribArray(0);\r
-    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
     glEnableVertexAttribArray(1);\r
+    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
 \r
     glBindVertexArray(0);\r
   }\r
@@ -142,6 +142,16 @@ struct arccam {
       rot.y = glm::radians(minY) * angleFactor;\r
   }\r
 \r
+  glm::vec3 getPos() {\r
+    float angle = rot.y / angleFactor;\r
+  \r
+    float camY = sin(angle) * exp(radius);\r
+    float camZ = cos(angle) * exp(radius);\r
+\r
+    glm::vec3 result(0.0, camY, camZ);\r
+    return glm::rotate(result, -rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+  }\r
+\r
   glm::mat4 getViewMatrix() {\r
     float angle = rot.y / angleFactor;\r
   \r
@@ -160,14 +170,10 @@ private:
 \r
 std::string readFile(std::string filename) {\r
   std::ifstream ifs(filename, std::ios::binary);\r
-  ifs.seekg(0, ifs.end);\r
-  long length = ifs.tellg();\r
-  ifs.seekg(0, ifs.beg);\r
-  char *buffer = (char*)malloc(length);\r
-  ifs.read(buffer, length);\r
-  ifs.close();\r
-  std::string result(buffer);\r
-  free(buffer);\r
+  std::string result, line;\r
+  while (std::getline(ifs, line))\r
+    result += line + "\n";\r
+\r
   return result;\r
 }\r
 \r
@@ -213,7 +219,7 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
   glGetShaderiv(vertShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
     glGetShaderInfoLog(vertShader, 512, NULL, infoLog);\r
-    printf("Error compiling vertex shader: %s\n", infoLog);\r
+    printf("Error compiling vertex shader(%s): %s\n", vertFilename, infoLog);\r
   }\r
 \r
   GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);\r
@@ -225,7 +231,7 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
   glGetShaderiv(fragShader, GL_COMPILE_STATUS, &success);\r
   if (!success) {\r
     glGetShaderInfoLog(fragShader, 512, NULL, infoLog);\r
-    printf("Error compiling fragment shader: %s\n", infoLog);\r
+    printf("Error compiling fragment shader(%s): %s\n", fragFilename, infoLog);\r
   }\r
 \r
   // Link Shader Program\r
@@ -251,6 +257,8 @@ GLuint compileShaders(const char *vertFilename, const char *fragFilename) {
 int main() {\r
   // Window Setup\r
 \r
+  const int width = 1600, height = 900;\r
+\r
   sf::ContextSettings settings;\r
   settings.depthBits = 24;\r
   settings.antialiasingLevel = 0;\r
@@ -285,6 +293,69 @@ int main() {
 \r
   glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
 \r
+  // Framebuffer\r
+  GLuint fbo;\r
+  glGenFramebuffers(1, &fbo);\r
+  glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+  \r
+  GLuint renderTexture;\r
+  glGenTextures(1, &renderTexture);\r
+  glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);\r
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\r
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\r
+  //glBindTexture(GL_TEXTURE_2D, 0);\r
+  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0);\r
+\r
+  GLuint rbo;\r
+  glGenRenderbuffers(1, &rbo);\r
+  glBindRenderbuffer(GL_RENDERBUFFER, rbo);\r
+  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);\r
+  //glBindRenderbuffer(GL_RENDERBUFFER, 0);\r
+  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);\r
+\r
+  if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {\r
+    printf("Successfully created framebuffer\n");\r
+  }\r
+  glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+  \r
+  GLuint screenShaderProgram = compileShaders("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl");\r
+  glUseProgram(screenShaderProgram);\r
+  glUniform1i(glGetUniformLocation(screenShaderProgram, "screenTexture"), 0);\r
+\r
+  // Screen VAO\r
+  \r
+  GLuint screenVBO;\r
+  glGenBuffers(1, &screenVBO);\r
+\r
+  GLuint screenVAO;\r
+  glGenVertexArrays(1, &screenVAO);\r
+\r
+  glBindVertexArray(screenVAO);\r
+\r
+  float screenVerts[] = {\r
+    -1.0f, +1.0f, +0.0f, +1.0f,\r
+    -1.0f, -1.0f, +0.0f, +0.0f,\r
+    +1.0f, -1.0f, +1.0f, +0.0f,\r
\r
+    -1.0f, +1.0f, +0.0f, +1.0f,\r
+    +1.0f, -1.0f, +1.0f, +0.0f,\r
+    +1.0f, +1.0f, +1.0f, +1.0f,\r
+  };\r
+\r
+  glBindBuffer(GL_ARRAY_BUFFER, screenVBO);\r
+  glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4,\r
+              screenVerts, GL_STATIC_DRAW);\r
+\r
+  glEnableVertexAttribArray(0);\r
+  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(0));\r
+  glEnableVertexAttribArray(1);\r
+  glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(sizeof(float) * 2));\r
+\r
+  glBindVertexArray(0);\r
+\r
+  // Config\r
+\r
   struct {\r
     bool wireframe = false;\r
     bool freecam = false;\r
@@ -343,10 +414,11 @@ int main() {
 \r
     prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right);\r
 \r
-    // Render\r
+    // Render to fbo\r
 \r
+    glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);\r
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
-\r
     glEnable(GL_DEPTH_TEST);\r
 \r
     if (options.wireframe)\r
@@ -380,11 +452,27 @@ int main() {
     glUniform3fv(\r
       glGetUniformLocation(shaderProgram, "lightPos"),\r
       1, glm::value_ptr(lightPos));\r
+    glUniform3fv(\r
+      glGetUniformLocation(shaderProgram, "viewPos"),\r
+      1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
 \r
     m.draw();\r
+\r
+    // Render fbo to screen\r
     \r
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+    glDisable(GL_DEPTH_TEST);\r
+    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);\r
+    glClear(GL_COLOR_BUFFER_BIT);\r
+    glUseProgram(screenShaderProgram);\r
+\r
+    glBindVertexArray(screenVAO);\r
+    glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+    glDrawArrays(GL_TRIANGLES, 0, 6);\r
+    glBindVertexArray(0);\r
+\r
     ImGui::SFML::Update(window, deltaClock.restart());\r
 \r
     ImGui::Begin("Options");\r
@@ -412,5 +500,7 @@ int main() {
     window.display();\r
   }\r
 \r
+  glDeleteFramebuffers(1, &fbo);\r
+\r
   return 0;\r
 }
\ No newline at end of file