draw a shaded quad, track mouse

This commit is contained in:
Josh Holtrop 2013-06-11 22:18:23 -04:00
parent 10faaa37b6
commit c0eefab306

View File

@ -17,12 +17,16 @@ class Example
def load_shaders def load_shaders
v_id = glCreateShader(GL_VERTEX_SHADER) v_id = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(v_id, <<-EOS) glShaderSource(v_id, <<-EOS)
uniform vec2 offset;
uniform vec2 screen_size;
attribute vec2 pos; attribute vec2 pos;
varying vec4 pos_i; varying vec4 pos_i;
void main() void main()
{ {
pos_i = vec4(pos, 0, 1); vec2 scaled_pos = vec2((offset.x - screen_size.x / 2) / screen_size.x * 2,
(offset.y - screen_size.y / 2) / screen_size.y * 2);
pos_i = vec4(pos + scaled_pos, 0, 1);
gl_Position = pos_i; gl_Position = pos_i;
} }
EOS EOS
@ -37,7 +41,9 @@ class Example
void main() void main()
{ {
gl_FragColor = pos_i; gl_FragColor = vec4((pos_i.x + 1.0) / 2.0,
(pos_i.y + 1.0) / 2.0,
0, 1);
} }
EOS EOS
glCompileShader(f_id) glCompileShader(f_id)
@ -52,6 +58,8 @@ class Example
unless glGetProgramiv(p_id, GL_LINK_STATUS) unless glGetProgramiv(p_id, GL_LINK_STATUS)
raise glGetProgramInfoLog(p_id) raise glGetProgramInfoLog(p_id)
end end
$offset_loc = glGetUniformLocation(p_id, "offset")
$screen_size_loc = glGetUniformLocation(p_id, "screen_size")
glUseProgram(p_id) glUseProgram(p_id)
end end
@ -68,6 +76,15 @@ class Example
end end
def run def run
quad_attrs = [0.02, 0.02,
-0.02, 0.02,
-0.02, -0.02,
0.02, -0.02].pack("f*")
b_id = glGenBuffers(1).first
glBindBuffer(GL_ARRAY_BUFFER, b_id);
glBufferData(GL_ARRAY_BUFFER, 2 * 4 * 4, quad_attrs, GL_STATIC_DRAW);
x, y = 0, 0
while @window.open? while @window.open?
@window.each_event do |event| @window.each_event do |event|
case event.type case event.type
@ -81,13 +98,25 @@ class Example
@fullscreen = !@fullscreen @fullscreen = !@fullscreen
create_window create_window
end end
when Event::MouseMoved
x = event.mouse_move.x
y = event.mouse_move.y
when Event::Resized # Resize event : adjust viewport when Event::Resized # Resize event : adjust viewport
x = event.size.width / 2
y = event.size.height / 2
glViewport(0, 0, event.size.width, event.size.height) glViewport(0, 0, event.size.width, event.size.height)
end end
end end
break unless @window.open?
glClear(GL_COLOR_BUFFER_BIT) glClear(GL_COLOR_BUFFER_BIT)
glUniform2f($offset_loc, x, @window.getSize.y - y)
glUniform2f($screen_size_loc, @window.getSize.x, @window.getSize.y)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * 4, 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
@window.display @window.display
end end
end end