Added shader support, removed unused debugging puts statements and fixed Gosu Font.draw deprecation warning.

This commit is contained in:
2018-12-10 18:50:25 -06:00
parent 74b0a0ef6f
commit 4d8638d81c
13 changed files with 201 additions and 29 deletions

View File

@@ -27,9 +27,17 @@ class IMICFPS
handleGlError
draw_mesh(object.model)
object.draw
if ShaderManager.shader("lighting")
ShaderManager.shader("lighting").use do |shader|
handleGlError
draw_mesh(object.model)
object.draw
end
else
handleGlError
draw_mesh(object.model)
object.draw
end
handleGlError
glPopMatrix
@@ -56,21 +64,29 @@ class IMICFPS
glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
# glBindBuffer(GL_ARRAY_BUFFER, model.vertices_buffer)
# glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0)
if $debug # This is kinda expensive
glDisable(GL_LIGHTING)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
glPolygonOffset(2, 0.5)
glLineWidth(3)
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
glLineWidth(1)
glPolygonOffset(0, 0)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
glEnable(GL_LIGHTING)
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
else
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
end
# glBindBuffer(GL_ARRAY_BUFFER, 0)
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_COLOR_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)

112
lib/renderer/shader.rb Normal file
View File

@@ -0,0 +1,112 @@
class IMICFPS
# Ref: https://github.com/vaiorabbit/ruby-opengl/blob/master/sample/OrangeBook/brick.rb
class Shader
include OpenGL
def initialize(name:, vertex_file:, fragment_file:)
@name = name
@vertex_file = vertex_file
@fragment_file = fragment_file
@compiled = false
@error_buffer_size = 1024
create_shaders
compile_shaders
if @compiled
ShaderManager.add_shader(@name, self)
else
puts "FAILED to compile shader: #{@name}", ""
end
end
def shader_files_exist?
File.exists?(@vertex_file) && File.exists?(@fragment_file)
end
def create_shaders
return unless shader_files_exist?
@vertex = glCreateShader(GL_VERTEX_SHADER)
@fragment = glCreateShader(GL_FRAGMENT_SHADER)
source = [File.read(@vertex_file)].pack('p')
size = [File.size(@vertex_file)].pack('I')
glShaderSource(@vertex, 1, source, size)
source = [File.read(@fragment_file)].pack('p')
size = [File.size(@fragment_file)].pack('I')
glShaderSource(@fragment, 1, source, size)
end
def compile_shaders
return unless shader_files_exist?
glCompileShader(@vertex)
buffer = ' '
glGetShaderiv(@vertex, GL_COMPILE_STATUS, buffer)
compiled = buffer.unpack('L')[0]
if compiled == 0
log = ' ' * @error_buffer_size
glGetShaderInfoLog(@vertex, @error_buffer_size, nil, log)
puts "Vertex Shader InfoLog:\n#{log.strip}\n"
puts "Shader Compiled status: #{compiled}"
puts
end
glCompileShader(@fragment)
buffer = ' '
glGetShaderiv(@fragment, GL_COMPILE_STATUS, buffer)
compiled = buffer.unpack('L')[0]
if compiled == 0
log = ' ' * @error_buffer_size
glGetShaderInfoLog(@fragment, @error_buffer_size, nil, log)
puts "Fragment Shader InfoLog:\n#{log.strip}\n"
puts "Shader Compiled status: #{compiled}"
puts
end
@program = glCreateProgram
glAttachShader(@program, @vertex)
glAttachShader(@program, @fragment)
glLinkProgram(@program)
buffer = ' '
glGetProgramiv(@program, GL_LINK_STATUS, buffer)
linked = buffer.unpack('L')[0]
if linked == 0
log = ' ' * @error_buffer_size
glGetProgramInfoLog(@program, @error_buffer_size, nil, log)
puts "Program InfoLog:\n#{log.strip}\n"
end
@compiled = linked == 0 ? false : true
end
# Returns the location of a uniform variable
def variable(variable)
loc = glGetUniformLocation(@program, variable)
if (loc == -1)
puts "Shader:\"#{@name}\" No such uniform named #{variable}"
end
return loc
end
def use(&block)
return unless compiled?
glUseProgram(@program)
block.call(self) if block
glUseProgram(0)
end
def compiled?
@compiled
end
end
end