Class: CyberarmEngine::GBuffer
- Inherits:
-
Object
- Object
- CyberarmEngine::GBuffer
- Includes:
- OpenGL
- Defined in:
- lib/cyberarm_engine/opengl/renderer/g_buffer.rb
Instance Attribute Summary collapse
-
#height ⇒ Object
readonly
Returns the value of attribute height.
-
#screen_vbo ⇒ Object
readonly
Returns the value of attribute screen_vbo.
-
#uvs ⇒ Object
readonly
Returns the value of attribute uvs.
-
#vertices ⇒ Object
readonly
Returns the value of attribute vertices.
-
#width ⇒ Object
readonly
Returns the value of attribute width.
Instance Method Summary collapse
- #bind_for_reading ⇒ Object
- #bind_for_writing ⇒ Object
- #clean_up ⇒ Object
- #create_framebuffer ⇒ Object
- #create_screen_vbo ⇒ Object
- #create_textures ⇒ Object
-
#initialize(width:, height:) ⇒ GBuffer
constructor
A new instance of GBuffer.
- #set_read_buffer(buffer) ⇒ Object
- #set_read_buffer_depth ⇒ Object
- #texture(type) ⇒ Object
- #unbind_framebuffer ⇒ Object
Constructor Details
#initialize(width:, height:) ⇒ GBuffer
Returns a new instance of GBuffer.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 8 def initialize(width:, height:) @width = width @height = height @framebuffer = nil @buffers = i[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, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 ].freeze create_framebuffer create_screen_vbo end |
Instance Attribute Details
#height ⇒ Object (readonly)
Returns the value of attribute height.
6 7 8 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 6 def height @height end |
#screen_vbo ⇒ Object (readonly)
Returns the value of attribute screen_vbo.
5 6 7 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 5 def screen_vbo @screen_vbo end |
#uvs ⇒ Object (readonly)
Returns the value of attribute uvs.
5 6 7 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 5 def uvs @uvs end |
#vertices ⇒ Object (readonly)
Returns the value of attribute vertices.
5 6 7 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 5 def vertices @vertices end |
#width ⇒ Object (readonly)
Returns the value of attribute width.
6 7 8 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 6 def width @width end |
Instance Method Details
#bind_for_reading ⇒ Object
137 138 139 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 137 def bind_for_reading glBindFramebuffer(GL_READ_FRAMEBUFFER, @framebuffer) end |
#bind_for_writing ⇒ Object
133 134 135 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 133 def bind_for_writing glBindFramebuffer(GL_DRAW_FRAMEBUFFER, @framebuffer) end |
#clean_up ⇒ Object
157 158 159 160 161 162 163 164 165 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 157 def clean_up glDeleteFramebuffers(1, [@framebuffer].pack("L")) glDeleteTextures(@textures.values.size, @textures.values.pack("L*")) glDeleteBuffers(2, [@positions_buffer_id, @uvs_buffer_id].pack("L*")) glDeleteVertexArrays(1, [@screen_vbo].pack("L")) gl_error? end |
#create_framebuffer ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 42 def create_framebuffer buffer = " " * 4 glGenFramebuffers(1, buffer) @framebuffer = buffer.unpack1("L2") glBindFramebuffer(GL_DRAW_FRAMEBUFFER, @framebuffer) create_textures status = glCheckFramebufferStatus(GL_FRAMEBUFFER) if status != GL_FRAMEBUFFER_COMPLETE = "" = case status when GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" when GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" when GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER" when GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER" when GL_FRAMEBUFFER_UNSUPPORTED "GL_FRAMEBUFFER_UNSUPPORTED" else "Unknown error!" end puts "Incomplete framebuffer: #{status}\nError: #{message}" else @ready = true end glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0) end |
#create_screen_vbo ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 105 def create_screen_vbo buffer = " " * 4 glGenVertexArrays(1, buffer) @screen_vbo = buffer.unpack1("L2") buffer = " " * 4 glGenBuffers(1, buffer) @positions_buffer_id = buffer.unpack1("L2") buffer = " " * 4 glGenBuffers(1, buffer) @uvs_buffer_id = buffer.unpack1("L2") 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) glEnableVertexAttribArray(0) glEnableVertexAttribArray(1) glBindVertexArray(0) end |
#create_textures ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 78 def create_textures @buffers.size.times do |i| buffer = " " * 4 glGenTextures(1, buffer) texture_id = buffer.unpack1("L2") @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) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, texture_id, 0) end buffer = " " * 4 glGenTextures(1, buffer) texture_id = buffer.unpack1("L2") @textures[:depth] = texture_id glBindTexture(GL_TEXTURE_2D, texture_id) 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] glDrawBuffers(draw_buffers.size, draw_buffers.pack("I*")) end |
#set_read_buffer(buffer) ⇒ Object
141 142 143 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 141 def set_read_buffer(buffer) glReadBuffer(GL_COLOR_ATTACHMENT0 + @textures.keys.index(buffer)) end |
#set_read_buffer_depth ⇒ Object
145 146 147 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 145 def set_read_buffer_depth glReadBuffer(GL_DEPTH_ATTACHMENT) end |
#texture(type) ⇒ Object
153 154 155 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 153 def texture(type) @textures[type] end |
#unbind_framebuffer ⇒ Object
149 150 151 |
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 149 def unbind_framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0) end |