mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-15 15:42:35 +00:00
Initial work on using framebuffer from GBuffer
This commit is contained in:
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
10
shaders/fragment/render_screen.glsl
Normal file
10
shaders/fragment/render_screen.glsl
Normal file
@@ -0,0 +1,10 @@
|
||||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
|
||||
in vec2 outTexCoords;
|
||||
|
||||
uniform sampler2D screenTexture;
|
||||
|
||||
void main() {
|
||||
FragColor = texture(screenTexture, outTexCoords);
|
||||
}
|
||||
10
shaders/vertex/render_screen.glsl
Normal file
10
shaders/vertex/render_screen.glsl
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user