Initial work on using framebuffer from GBuffer

This commit is contained in:
2020-03-25 09:18:06 -05:00
parent 9a195fbf68
commit d293772690
5 changed files with 103 additions and 3 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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,

View File

@@ -0,0 +1,10 @@
#version 330 core
out vec4 FragColor;
in vec2 outTexCoords;
uniform sampler2D screenTexture;
void main() {
FragColor = texture(screenTexture, outTexCoords);
}

View File

@@ -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;
}