From 07d2d8ea05c535943e5ae51ab36daf34cb355e3b Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Wed, 25 Mar 2020 16:16:47 -0500 Subject: [PATCH] Work In Progress --- lib/renderer/g_buffer.rb | 10 ++-- lib/renderer/opengl_renderer.rb | 61 ++++++++++----------- lib/renderer/renderer.rb | 2 +- shaders/fragment/default.glsl | 91 +++---------------------------- shaders/fragment/lighting.glsl | 17 ++++++ shaders/vertex/default.glsl | 2 - shaders/vertex/lighting.glsl | 28 ++++++++++ shaders/vertex/render_screen.glsl | 4 +- 8 files changed, 89 insertions(+), 126 deletions(-) create mode 100644 shaders/fragment/lighting.glsl create mode 100644 shaders/vertex/lighting.glsl diff --git a/lib/renderer/g_buffer.rb b/lib/renderer/g_buffer.rb index 5388caf..4adb1e7 100644 --- a/lib/renderer/g_buffer.rb +++ b/lib/renderer/g_buffer.rb @@ -5,7 +5,7 @@ class IMICFPS attr_reader :screen_vbo, :vertices, :uvs def initialize @framebuffer = nil - @buffers = [:position, :diffuse, :normal, :texcoord] + @buffers = [:position, :diffuse, :normal, :texcoord, :scene] @textures = {} @screen_vbo = nil @ready = false @@ -86,9 +86,9 @@ class IMICFPS @textures[@buffers[i]] = texture_id glBindTexture(GL_TEXTURE_2D, texture_id) - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, nil) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, nil) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, texture_id, 0) end @@ -101,7 +101,7 @@ class IMICFPS glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nil) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture_id, 0) - draw_buffers = [ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 ] + draw_buffers = @buffers.each_with_index.map { |b ,i| Object.const_get("GL_COLOR_ATTACHMENT#{i}") } glDrawBuffers(draw_buffers.size, draw_buffers.pack("I*")) end diff --git a/lib/renderer/opengl_renderer.rb b/lib/renderer/opengl_renderer.rb index 01f9e0b..0a3231f 100644 --- a/lib/renderer/opengl_renderer.rb +++ b/lib/renderer/opengl_renderer.rb @@ -16,7 +16,7 @@ class IMICFPS end def render(camera, lights, entities) - if Shader.available?("default") && Shader.available?("render_screen") + if Shader.available?("default") && Shader.available?("render_screen") && Shader.available?("lighting") @g_buffer.bind_for_writing gl_error? @@ -24,19 +24,6 @@ class IMICFPS glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) Shader.use("default") do |shader| - lights.each_with_index do |light, i| - shader.uniform_float("lights[#{i}.end", -1.0); - shader.uniform_float("lights[#{i}.type", light.type); - shader.uniform_vec3("lights[#{i}].position", light.position) - shader.uniform_vec3("lights[#{i}].ambient", light.ambient) - shader.uniform_vec3("lights[#{i}].diffuse", light.diffuse) - shader.uniform_vec3("lights[#{i}].specular", light.specular) - end - gl_error? - - - shader.uniform_integer("totalLights", lights.size) - entities.each do |entity| next unless entity.visible && entity.renderable @@ -52,6 +39,9 @@ class IMICFPS end end + lighting(lights) + post_processing + @g_buffer.unbind_framebuffer gl_error? @@ -59,8 +49,6 @@ class IMICFPS @g_buffer.bind_for_reading glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0) - # lighting(lights) - post_processing render_framebuffer @g_buffer.unbind_framebuffer @@ -96,25 +84,32 @@ class IMICFPS end def lighting(lights) - @g_buffer.set_read_buffer(:position) - glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height, - 0, 0, @g_buffer.width / 2, @g_buffer.height / 2, - GL_COLOR_BUFFER_BIT, GL_LINEAR) + if Shader.available?("lighting") + Shader.use("lighting") do |shader| + lights.each do |light| + shader.uniform_integer("inLightType", light.type); + shader.uniform_vec3("inLightPosition", light.position) + shader.uniform_vec3("inLightAmbient", light.ambient) + shader.uniform_vec3("inLightDiffuse", light.diffuse) + shader.uniform_vec3("inLightSpecular", light.specular) - @g_buffer.set_read_buffer(:diffuse) - glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height, - 0, @g_buffer.height / 2, @g_buffer.width / 2, @g_buffer.height, - GL_COLOR_BUFFER_BIT, GL_LINEAR) + glBindVertexArray(@g_buffer.screen_vbo) + glEnableVertexAttribArray(0) + glEnableVertexAttribArray(1) - @g_buffer.set_read_buffer(:normal) - glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height, - @g_buffer.width / 2, @g_buffer.height / 2, @g_buffer.width, @g_buffer.height, - GL_COLOR_BUFFER_BIT, GL_LINEAR) + glDisable(GL_DEPTH_TEST) + glEnable(GL_BLEND) - @g_buffer.set_read_buffer(:texcoord) - glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height, - @g_buffer.width / 2, 0, @g_buffer.width, @g_buffer.height / 2, - GL_COLOR_BUFFER_BIT, GL_LINEAR) + glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size) + + glDisableVertexAttribArray(1) + glDisableVertexAttribArray(0) + glBindVertexArray(0) + end + + gl_error? + end + end end def post_processing @@ -131,7 +126,7 @@ class IMICFPS glEnable(GL_BLEND) glActiveTexture(GL_TEXTURE0) - glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse)) + glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:scene)) glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size) diff --git a/lib/renderer/renderer.rb b/lib/renderer/renderer.rb index 31a30d5..74a7735 100644 --- a/lib/renderer/renderer.rb +++ b/lib/renderer/renderer.rb @@ -10,7 +10,7 @@ class IMICFPS end def preload_default_shaders - shaders = ["default", "render_screen"] + shaders = ["default", "render_screen", "lighting"] shaders.each do |shader| Shader.new( name: shader, diff --git a/shaders/fragment/default.glsl b/shaders/fragment/default.glsl index 6952ff0..3ef42cb 100644 --- a/shaders/fragment/default.glsl +++ b/shaders/fragment/default.glsl @@ -1,19 +1,15 @@ # version 330 core -@include "light_struct" - -layout(location = 0) out vec3 fragPosition; +layout (location = 0) out vec4 fragPosition; layout (location = 1) out vec4 fragColor; -layout (location = 2) out vec3 fragNormal; -layout (location = 3) out vec3 fragUV; +layout (location = 2) out vec4 fragNormal; +layout (location = 3) out vec4 fragUV; in vec3 outPosition; in vec3 outColor; in vec3 outNormal; in vec3 outUV; in float outTextureID; -in Light outLights[MAX_LIGHTS]; -flat in int outTotalLights; in vec3 outFragPos; in vec3 outCameraPos; flat in int outHasTexture; @@ -21,88 +17,17 @@ flat in int outDisableLighting; uniform sampler2D diffuse_texture; -// optimizing compilers are annoying at this stage of my understanding of GLSL -vec4 lokiVar; - -// https://learnopengl.com/Lighting/Multiple-lights -vec3 calculatePointLight(Light light) { - vec3 viewDir = normalize(outCameraPos - outFragPos); - vec3 lightDir = normalize(light.position - outFragPos); - float diff = max(dot(vec3(outNormal), lightDir), 0.0); - vec3 reflectDir = reflect(-lightDir, vec3(outNormal)); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), 16.0); - - float distance = length(light.position - outFragPos); - float attenuation = 1.0 / (1.0 + 0.09 * distance + - 0.032 * (distance * distance)); - - vec3 ambient = light.ambient * outColor; - vec3 diffuse = light.diffuse * outColor; - vec3 specular = light.specular * spec * vec3(1.0, 1.0, 1.0); - - ambient *= attenuation; - diffuse *= attenuation; - specular *= attenuation; - - return (ambient + diffuse + specular); -} - -// https://learnopengl.com/Lighting/Basic-Lighting -vec3 calculateBasicLight(Light light) { - vec3 lightDir = normalize(light.position - outFragPos); - - float ambientStrength = 0.25; - vec3 ambient = ambientStrength * light.ambient; - - float diff = max(dot(normalize(vec3(outNormal)), lightDir), 0.0); - vec3 diffuse = diff * light.diffuse; - - float specularStrength = 0.5; - vec3 viewDir = normalize(outCameraPos - outFragPos); - vec3 reflectDir = reflect(-lightDir, outNormal); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); - vec3 specular = specularStrength * spec * light.specular; - - return vec3(ambient + diffuse + specular); -} - -vec3 calculateLighting() { - vec3 result = vec3(0.0, 0.0, 0.0); - - for (int i = 0; i < min(outTotalLights, MAX_LIGHTS); i++) { - if (int(outLights[i].type) == 0) { - result += calculateBasicLight(outLights[i]); - } else if (int(outLights[i].type) == 1) { - result += calculateBasicLight(outLights[i]); - } - } - - return result; -} - void main() { - lokiVar = vec4(outColor, 1.0) + vec4(outNormal, 1.0) + vec4(outUV, 1.0) + vec4(outTextureID, 1.0, 1.0, 1.0); - lokiVar = normalize(lokiVar); - vec3 result; if (outHasTexture == 0) { - if (outDisableLighting == 1.0) { - result = outColor + 0.25; - } else { - result = calculateLighting() * outColor; - } - + result = outColor; } else { - if (outDisableLighting == 1.0) { - result = texture(diffuse_texture, outUV.xy).xyz + 0.25; - } else { - result = calculateLighting() * texture(diffuse_texture, outUV.xy).xyz; - } + result = texture(diffuse_texture, outUV.xy).xyz; } - fragPosition = outPosition; + fragPosition = vec4(outPosition, 1.0); fragColor = vec4(result, 1.0); - fragNormal = outNormal; - fragUV = outUV; + fragNormal = vec4(outNormal, 1.0); + fragUV = vec4(outUV, 1.0); } diff --git a/shaders/fragment/lighting.glsl b/shaders/fragment/lighting.glsl new file mode 100644 index 0000000..5f8eee9 --- /dev/null +++ b/shaders/fragment/lighting.glsl @@ -0,0 +1,17 @@ +# version 330 core + +layout (location = 4) out vec4 sceneColor; + +flat in int outLightType; +in vec3 outLightPosition; +in vec3 outLightAmbient; +in vec3 outLightDiffuse; +in vec3 outLightSpecular; + +in vec2 outTexCoords; + +@include "light_struct" + +void main() { + sceneColor = vec4(1.0, 0.5, 0.25, 1.0); +} \ No newline at end of file diff --git a/shaders/vertex/default.glsl b/shaders/vertex/default.glsl index f864df6..62804b9 100644 --- a/shaders/vertex/default.glsl +++ b/shaders/vertex/default.glsl @@ -39,8 +39,6 @@ void main() { outUV = inUV; outTextureID = inTextureID; outHasTexture = hasTexture; - outLights = lights; - outTotalLights = totalLights; outCameraPos = cameraPos; outDisableLighting = disableLighting; diff --git a/shaders/vertex/lighting.glsl b/shaders/vertex/lighting.glsl new file mode 100644 index 0000000..7a5b242 --- /dev/null +++ b/shaders/vertex/lighting.glsl @@ -0,0 +1,28 @@ +#version 330 core +layout (location = 0) in vec3 inPosition; +layout (location = 1) in vec2 inTexCoords; + +in int inLightType; +in vec3 inLightPosition; +in vec3 inLightAmbient; +in vec3 inLightDiffuse; +in vec3 inLightSpecular; + +flat out int outLightType; +out vec3 outLightPosition; +out vec3 outLightAmbient; +out vec3 outLightDiffuse; +out vec3 outLightSpecular; + +out vec2 outTexCoords; + +void main() { + gl_Position = vec4(inPosition.x, inPosition.y, inPosition.z, 1.0); + + outLightType = inLightType; + outLightPosition = inLightPosition; + outLightAmbient = inLightAmbient; + outLightDiffuse = inLightDiffuse; + outLightSpecular = inLightSpecular; + outTexCoords = inTexCoords; +} \ No newline at end of file diff --git a/shaders/vertex/render_screen.glsl b/shaders/vertex/render_screen.glsl index d032ce4..64d635c 100644 --- a/shaders/vertex/render_screen.glsl +++ b/shaders/vertex/render_screen.glsl @@ -5,6 +5,6 @@ layout (location = 1) in vec2 inTexCoords; out vec2 outTexCoords; void main() { - gl_Position = vec4(inPosition.x, inPosition.y, inPosition.z, 1.0); + gl_Position = vec4(inPosition.x, inPosition.y, inPosition.z, 1.0); outTexCoords = inTexCoords; -} \ No newline at end of file +} \ No newline at end of file