samples/shaders/geometry.rb in ray-0.1.1 vs samples/shaders/geometry.rb in ray-0.2.0
- old
+ new
@@ -1,76 +1,134 @@
$:.unshift File.expand_path(File.dirname(__FILE__) + "/../../lib")
$:.unshift File.expand_path(File.dirname(__FILE__) + "/../../ext")
+def path_of(res)
+ File.expand_path(File.dirname(__FILE__) + "/../../test/res/#{res}")
+end
+
require 'ray'
-class Triangles < Ray::Drawable
- def initialize
- super
- self.vertex_count = 3
+Ray::GL.core_profile = true
+Ray::GL.major_version = 3
+Ray::GL.minor_version = 2
+
+class Sprites < Ray::Drawable
+ Radius = 300
+
+ def initialize(image)
+ super()
+
+ @image = image
+ self.vertex_count = 400
end
def fill_vertices
- [
- Ray::Vertex.new([0, 0], Ray::Color.red),
- Ray::Vertex.new([100, 0], Ray::Color.green),
- Ray::Vertex.new([100, 200], Ray::Color.blue),
- ]
+ Array.new(vertex_count) do
+ angle = rand * 2 * Math::PI
+ radius = Math.sqrt(rand) * Radius
+
+ pos = [Math.cos(angle) * radius, Math.sin(angle) * radius]
+ Ray::Vertex.new(pos,
+ Ray::Color.new(rand(256), rand(256), rand(256)))
+ end
end
def render(first, index)
- Ray::GL.draw_arrays :triangles, first, 3
+ @image.bind
+ Ray::GL.draw_arrays :points, first, vertex_count
end
end
Ray.game "Geometry shader" do
register { add_hook :quit, method(:exit!) }
scene :shader do
- @triangles = Triangles.new
+ @sprites = Sprites.new image(path_of("stone.png"))
+ @sprites.pos = window.size / 2
- geometry = <<-geometry
-#version 150
-
-layout(triangles) in;
-layout(triangle_strip, max_vertices = 6) out;
-
-void main() {
- for(int i = 0; i < gl_in.length(); i++) {
- gl_Position = gl_in[i].gl_Position;
- EmitVertex();
- }
- EndPrimitive();
-
- for(int i = 0; i < gl_in.length(); i++) {
- gl_Position = gl_in[i].gl_Position + vec4(0.3, 0, 0, 0);
- EmitVertex();
- }
- EndPrimitive();
-}
-geometry
-
vertex = <<-vertex
#version 150
in vec2 in_Vertex;
in vec4 in_Color;
in vec2 in_TexCoord;
uniform mat4 in_ModelView;
uniform mat4 in_Projection;
+out vec4 geom_Color;
+out vec2 geom_TexCoord;
+
+void main() {
+ gl_Position = vec4(in_Vertex, 0, 1) * (in_ModelView * in_Projection);
+ geom_Color = in_Color;
+ geom_TexCoord = in_TexCoord;
+}
+vertex
+
+ geometry = <<-geometry
+#version 150
+
+layout(points) in;
+layout(triangle_strip, max_vertices = 4) out;
+
+in vec4 geom_Color[];
+in vec2 geom_TexCoord[];
+
out vec4 var_Color;
out vec2 var_TexCoord;
+uniform float square_size;
+
+const float pixel_width = 1.0 / 640;
+const float pixel_height = 1.0 / 480;
+
+struct vertex {
+ vec4 pos;
+ vec4 color;
+ vec2 tex_coord;
+};
+
+void emit_vertex(vertex v) {
+ gl_Position = v.pos;
+ var_Color = v.color;
+ var_TexCoord = v.tex_coord;
+ EmitVertex();
+}
+
void main() {
- gl_Position = vec4(in_Vertex, 0, 1) * (in_ModelView * in_Projection);
- var_Color = in_Color;
- var_TexCoord = in_TexCoord;
+ float width = pixel_width * square_size / 2;
+ float height = pixel_height * square_size / 2;
+
+ vec4 position = gl_in[0].gl_Position;
+ vec4 color = geom_Color[0];
+
+ vertex vertices[4];
+
+ vertices[0].pos = position + vec4(-width, -height, 0, 0);
+ vertices[0].tex_coord = vec2(0, 0);
+ vertices[0].color = color;
+
+ vertices[1].pos = position + vec4(-width, +height, 0, 0);
+ vertices[1].tex_coord = vec2(0, 1);
+ vertices[1].color = color;
+
+ vertices[2].pos = position + vec4(+width, -height, 0, 0);
+ vertices[2].tex_coord = vec2(1, 0);
+ vertices[2].color = color;
+
+ vertices[3].pos = position + vec4(+width, +height, 0, 0);
+ vertices[3].tex_coord = vec2(1, 1);
+ vertices[3].color = color;
+
+ for (int i = 0; i < 4; i++)
+ emit_vertex(vertices[i]);
+ EndPrimitive();
}
-vertex
+geometry
+
frag = <<-frag
#version 150
uniform sampler2D in_Texture;
uniform bool in_TextureEnabled;
@@ -79,19 +137,31 @@
in vec2 var_TexCoord;
out vec4 out_FragColor;
void main() {
- out_FragColor = vec4(0, 1, 1, 1);
+ out_FragColor = var_Color * texture(in_Texture, var_TexCoord);
}
frag
window.shader.compile(:frag => StringIO.new(frag),
:vertex => StringIO.new(vertex),
:geometry => StringIO.new(geometry))
+ window.shader[:square_size] = @size = 15
+
+ always do
+ if holding? :+
+ window.shader[:square_size] = (@size += 3)
+ elsif holding? :-
+ window.shader[:square_size] = (@size -= 3)
+ end
+
+ @sprites.angle += 1.0
+ end
+
render do |win|
- win.draw @triangles
+ win.draw @sprites
end
end
scenes << :shader
end