From d29377269030a32dd39b9c297433d56ee170859b Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Wed, 25 Mar 2020 09:18:06 -0500 Subject: [PATCH] Initial work on using framebuffer from GBuffer --- lib/renderer/g_buffer.rb | 55 +++++++++++++++++++++++++++++ lib/renderer/opengl_renderer.rb | 29 +++++++++++++-- lib/renderer/renderer.rb | 2 +- shaders/fragment/render_screen.glsl | 10 ++++++ shaders/vertex/render_screen.glsl | 10 ++++++ 5 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 shaders/fragment/render_screen.glsl create mode 100644 shaders/vertex/render_screen.glsl diff --git a/lib/renderer/g_buffer.rb b/lib/renderer/g_buffer.rb index 3cee155..d683e61 100644 --- a/lib/renderer/g_buffer.rb +++ b/lib/renderer/g_buffer.rb @@ -2,13 +2,36 @@ class IMICFPS class GBuffer include CommonMethods + attr_reader :screen_vbo, :vertices, :uvs def initialize @framebuffer = nil @buffers = [:position, :diffuse, :normal, :texcoord] @textures = {} + @screen_vbo = nil @ready = false + @vertices = [ + -1.0, -1.0, 0, + 1.0, -1.0, 0, + -1.0, 1.0, 0, + + -1.0, 1.0, 0, + 1.0, -1.0, 0, + 1.0, 1.0, 0, + ].freeze + + @uvs = [ + 0, 1, + 1, 1, + 0, 0, + + 0, 0, + 1, 1, + 1, 0 + ].freeze + create_framebuffer + create_screen_vbo end def create_framebuffer @@ -72,6 +95,30 @@ class IMICFPS glDrawBuffers(draw_buffers.size, draw_buffers.pack("I*")) end + def create_screen_vbo + buffer = ' ' * 8 + glGenVertexArrays(1, buffer) + @screen_vbo = buffer.unpack('L2').first + + buffer = " " * 4 + glGenBuffers(1, buffer) + @positions_buffer_id = buffer.unpack('L2').first + + buffer = " " * 4 + glGenBuffers(1, buffer) + @uvs_buffer_id = buffer.unpack('L2').first + + glBindVertexArray(@screen_vbo) + glBindBuffer(GL_ARRAY_BUFFER, @positions_buffer_id) + glBufferData(GL_ARRAY_BUFFER, @vertices.size * Fiddle::SIZEOF_FLOAT, @vertices.pack("f*"), GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil) + + glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer_id) + glBufferData(GL_ARRAY_BUFFER, @uvs.size * Fiddle::SIZEOF_FLOAT, @uvs.pack("f*"), GL_STATIC_DRAW); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nil) + + end + def bind_for_writing glBindFramebuffer(GL_DRAW_FRAMEBUFFER, @framebuffer) end @@ -88,12 +135,20 @@ class IMICFPS glBindFramebuffer(GL_FRAMEBUFFER, 0) end + def texture(type) + @textures[type] + end + def clean_up glDeleteFramebuffers(@framebuffer) @textures.values.each do |id| glDeleteTextures(id) end + + glDeleteBuffers(@positions_buffer_id) + glDeleteBuffers(@uvs_buffer_id) + glDeleteVertexArrays(@screen_vbo) end end end \ No newline at end of file diff --git a/lib/renderer/opengl_renderer.rb b/lib/renderer/opengl_renderer.rb index 7d56fed..11b73e8 100644 --- a/lib/renderer/opengl_renderer.rb +++ b/lib/renderer/opengl_renderer.rb @@ -10,10 +10,10 @@ class IMICFPS def render(camera, lights, entities) if Shader.available?("default") - # @g_buffer.bind_for_writing + @g_buffer.bind_for_writing gl_error? - # glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) Shader.use("default") do |shader| lights.each_with_index do |light, i| @@ -46,6 +46,11 @@ class IMICFPS @g_buffer.unbind_framebuffer gl_error? + + lighting(lights) + post_processing + render_framebuffer + gl_error? else puts "Shader 'default' failed to compile, using immediate mode for rendering..." unless @@immediate_mode_warning @@immediate_mode_warning = true @@ -76,6 +81,26 @@ class IMICFPS gl_error? end + def lighting(lights) + end + + def post_processing + end + + def render_framebuffer + if Shader.available?("render_screen") + Shader.use("render_screen") do |shader| + glBindVertexArray(@g_buffer.screen_vbo) + glEnableVertexAttribArray(0) + glEnableVertexAttribArray(1) + + glDisable(GL_DEPTH_TEST) + glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse)) + glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size) + end + end + end + def draw_model(model, shader) glBindVertexArray(model.vertex_array_id) glEnableVertexAttribArray(0) diff --git a/lib/renderer/renderer.rb b/lib/renderer/renderer.rb index 3ca54bf..66b213e 100644 --- a/lib/renderer/renderer.rb +++ b/lib/renderer/renderer.rb @@ -10,7 +10,7 @@ class IMICFPS end def preload_default_shaders - shaders = ["default"] + shaders = ["default", "render_screen"] shaders.each do |shader| Shader.new( name: shader, diff --git a/shaders/fragment/render_screen.glsl b/shaders/fragment/render_screen.glsl new file mode 100644 index 0000000..672b2eb --- /dev/null +++ b/shaders/fragment/render_screen.glsl @@ -0,0 +1,10 @@ +#version 330 core +out vec4 FragColor; + +in vec2 outTexCoords; + +uniform sampler2D screenTexture; + +void main() { + FragColor = texture(screenTexture, outTexCoords); +} \ No newline at end of file diff --git a/shaders/vertex/render_screen.glsl b/shaders/vertex/render_screen.glsl new file mode 100644 index 0000000..6acd275 --- /dev/null +++ b/shaders/vertex/render_screen.glsl @@ -0,0 +1,10 @@ +#version 330 core +layout (location = 0) in vec2 inPosition; +layout (location = 1) in vec2 inTexCoords; + +out vec2 outTexCoords; + +void main() { + gl_Position = vec4(inPosition.x, inPosition.y, inPosition.z, 1.0); + outTexCoords = inTexCoords; +} \ No newline at end of file