Class: CyberarmEngine::GBuffer

Inherits:
Object
  • Object
show all
Includes:
OpenGL
Defined in:
lib/cyberarm_engine/opengl/renderer/g_buffer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#heightObject (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_vboObject (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

#uvsObject (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

#verticesObject (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

#widthObject (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_readingObject



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_writingObject



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_upObject



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_framebufferObject



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
    message = ""

    message = 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_vboObject



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_texturesObject



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_depthObject



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_framebufferObject



149
150
151
# File 'lib/cyberarm_engine/opengl/renderer/g_buffer.rb', line 149

def unbind_framebuffer
  glBindFramebuffer(GL_FRAMEBUFFER, 0)
end