]> gitweb.ps.run Git - subsurface_scattering/commitdiff
Screen Space SSS
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 3 Feb 2021 10:08:49 +0000 (11:08 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 3 Feb 2021 10:08:49 +0000 (11:08 +0100)
shaders/fbo_frag.glsl
src/main.cpp

index cf1fafa6e6aa01b5ee0d36241b7c06e87cfbe3b6..f6f12cd88f0c530627682d68a0a86e6472fa07cd 100644 (file)
@@ -4,10 +4,30 @@ out vec4 FragColor;
 in vec2 TexCoords;\r
 \r
 uniform sampler2D screenTexture;\r
+uniform int applySSSSS;\r
+uniform int N;\r
 \r
 void main()\r
-{ \r
-    FragColor = vec4(\r
-        texture(screenTexture, TexCoords).rgb,\r
-        1.0);\r
+{\r
+    if (applySSSSS == 1) {\r
+        float x = 1.0/1600.0;\r
+        float y = 1.0/900.0;\r
+\r
+        float maxDist = N*N + N*N;\r
+\r
+        vec4 color = vec4(0, 0, 0, 1);\r
+        for (int i = -N; i <= N; i++) {\r
+            for (int j = -N; j <= N; j++) {\r
+                float dist = i*i + j*j;\r
+                vec4 newC = texture(screenTexture, TexCoords + vec2(i*x, j*y)) / (2*N*N);\r
+                float factor = 1 - (dist / maxDist);\r
+                factor = pow(factor, 2);\r
+                color += newC * factor;\r
+            }\r
+        }\r
+        FragColor = color;\r
+    }\r
+    else {\r
+        FragColor = texture(screenTexture, TexCoords);\r
+    }\r
 }\r
index 41d5e76ea9db2cf5da6797c057d77c3c10662a45..4168c502ca31dcd98fc99c4209fdba4012743e4f 100644 (file)
@@ -304,6 +304,8 @@ int main() {
   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
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\r
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
   //glBindTexture(GL_TEXTURE_2D, 0);\r
   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0);\r
 \r
@@ -359,6 +361,8 @@ int main() {
   struct {\r
     bool wireframe = false;\r
     bool freecam = false;\r
+    bool sssss = false;\r
+    int N = 2;\r
   } options;\r
 \r
   sf::Clock deltaClock;\r
@@ -468,6 +472,9 @@ int main() {
     glClear(GL_COLOR_BUFFER_BIT);\r
     glUseProgram(screenShaderProgram);\r
 \r
+    glUniform1i(glGetUniformLocation(screenShaderProgram, "applySSSSS"), options.sssss);\r
+    glUniform1i(glGetUniformLocation(screenShaderProgram, "N"), options.N);\r
+\r
     glBindVertexArray(screenVAO);\r
     glBindTexture(GL_TEXTURE_2D, renderTexture);\r
     glDrawArrays(GL_TRIANGLES, 0, 6);\r
@@ -478,6 +485,10 @@ int main() {
     ImGui::Begin("Options");\r
     ImGui::Checkbox("Wireframe", &options.wireframe);\r
     ImGui::Checkbox("Free Cam", &options.freecam);\r
+    ImGui::Checkbox("SSSSS", &options.sssss);\r
+    if (options.sssss) {\r
+      ImGui::DragInt("N", &options.N, 0.05f, 1, 16);\r
+    }\r
     if (options.freecam) {\r
       ImGui::LabelText("Position", "%f %f %f", freeCam.pos.x, freeCam.pos.y, freeCam.pos.z);\r
       ImGui::LabelText("Rotation", "%f %f", freeCam.rot.x, freeCam.rot.y);\r