draw a shaded quad, track mouse
This commit is contained in:
parent
10faaa37b6
commit
c0eefab306
33
example.rb
33
example.rb
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user