mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-16 08:02:36 +00:00
Setup GBuffer for future deferred rendering
This commit is contained in:
@@ -40,6 +40,7 @@ require_relative "lib/managers/collision_manager"
|
|||||||
require_relative "lib/managers/physics_manager"
|
require_relative "lib/managers/physics_manager"
|
||||||
|
|
||||||
require_relative "lib/renderer/renderer"
|
require_relative "lib/renderer/renderer"
|
||||||
|
require_relative "lib/renderer/g_buffer"
|
||||||
require_relative "lib/renderer/opengl_renderer"
|
require_relative "lib/renderer/opengl_renderer"
|
||||||
require_relative "lib/renderer/bounding_box_renderer"
|
require_relative "lib/renderer/bounding_box_renderer"
|
||||||
|
|
||||||
|
|||||||
83
lib/renderer/g_buffer.rb
Normal file
83
lib/renderer/g_buffer.rb
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
class IMICFPS
|
||||||
|
class GBuffer
|
||||||
|
include CommonMethods
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@framebuffer = nil
|
||||||
|
@buffers = [:position, :diffuse, :normal, :texcoord]
|
||||||
|
@textures = {}
|
||||||
|
@ready = false
|
||||||
|
|
||||||
|
create_framebuffer
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_framebuffer
|
||||||
|
buffer = ' ' * 8
|
||||||
|
glGenFramebuffers(1, buffer)
|
||||||
|
@framebuffer = buffer.unpack('L2').first
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, @framebuffer)
|
||||||
|
|
||||||
|
create_textures
|
||||||
|
|
||||||
|
status = glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
||||||
|
|
||||||
|
if status != GL_FRAMEBUFFER_COMPLETE
|
||||||
|
message = ""
|
||||||
|
|
||||||
|
case status
|
||||||
|
when GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
|
||||||
|
message = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"
|
||||||
|
when GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
|
||||||
|
message = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"
|
||||||
|
when GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
|
||||||
|
message = "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"
|
||||||
|
when GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER
|
||||||
|
message = "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"
|
||||||
|
when GL_FRAMEBUFFER_UNSUPPORTED
|
||||||
|
message = "GL_FRAMEBUFFER_UNSUPPORTED"
|
||||||
|
else
|
||||||
|
message = "Unknown error!"
|
||||||
|
end
|
||||||
|
puts "Incomplete framebuffer: #{status}\nError: #{message}"
|
||||||
|
else
|
||||||
|
@ready = true
|
||||||
|
end
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_textures
|
||||||
|
@buffers.size.times do |i|
|
||||||
|
buffer = ' ' * 8
|
||||||
|
glGenTextures(1, buffer)
|
||||||
|
texture_id = buffer.unpack('L2').first
|
||||||
|
@textures[@buffers[i]] = texture_id
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture_id)
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, window.width, window.height, 0, GL_RGB, GL_FLOAT, nil)
|
||||||
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, texture_id, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
buffer = ' ' * 8
|
||||||
|
glGenTextures(1, buffer)
|
||||||
|
texture_id = buffer.unpack('L2').first
|
||||||
|
@textures[:depth] = texture_id
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture_id)
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, window.width, window.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 ]
|
||||||
|
glDrawBuffers(draw_buffers.size, draw_buffers.pack("I*"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def clean_up
|
||||||
|
glDeleteFramebuffers(@framebuffer)
|
||||||
|
|
||||||
|
@textures.values.each do |id|
|
||||||
|
glDeleteTextures(id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -2,8 +2,10 @@ class IMICFPS
|
|||||||
class OpenGLRenderer
|
class OpenGLRenderer
|
||||||
include CommonMethods
|
include CommonMethods
|
||||||
|
|
||||||
|
@@immediate_mode_warning = false
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@immediate_mode_warning = false
|
@g_buffer = GBuffer.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def draw_object(camera, lights, object)
|
def draw_object(camera, lights, object)
|
||||||
@@ -32,8 +34,8 @@ class IMICFPS
|
|||||||
object.draw
|
object.draw
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
puts "Shader 'default' failed to compile, using immediate mode for rendering..." unless @immediate_mode_warning
|
puts "Shader 'default' failed to compile, using immediate mode for rendering..." unless @@immediate_mode_warning
|
||||||
@immediate_mode_warning = true
|
@@immediate_mode_warning = true
|
||||||
|
|
||||||
gl_error?
|
gl_error?
|
||||||
lights.each(&:draw)
|
lights.each(&:draw)
|
||||||
|
|||||||
Reference in New Issue
Block a user