opengl3 0.0.1.pre3 → 0.0.1.pre4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,163 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'opengl'
4
- require 'glut'
5
-
6
- class TestApp
7
- include GLUT
8
- include OpenGL::Constants
9
-
10
- def initialize
11
- glutInit()
12
- caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
- if FFI::Platform.mac?
14
- caps |= GLUT_3_2_CORE_PROFILE
15
- else
16
- glutInitContextVersion(3, 2)
17
- glutInitContextProfile(:core)
18
- end
19
- glutInitDisplayMode(caps)
20
- glutInitWindowPosition(300, 200)
21
- glutInitWindowSize(512, 512)
22
- glutCreateWindow('test')
23
-
24
- # prevent callback proc from being garbage-collected
25
- glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
26
- end
27
-
28
- def start
29
- self.extend OpenGL::GL.entrypoints
30
- puts glGetString(GL_VERSION)
31
-
32
- @quad = begin
33
- buffer = glGenBuffers(1)[0]
34
- glBindBuffer(GL_ARRAY_BUFFER, buffer)
35
- glBufferData(GL_ARRAY_BUFFER, 3 * 4 * 4, nil, GL_STATIC_DRAW)
36
- glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
37
- ptr.put_array_of_GLfloat( 0, [-0.5, 0.5, 0.0])
38
- ptr.put_array_of_GLfloat(12, [-0.5,-0.5, 0.0])
39
- ptr.put_array_of_GLfloat(24, [ 0.5, 0.5, 0.0])
40
- ptr.put_array_of_GLfloat(36, [ 0.5,-0.5, 0.0])
41
- end
42
-
43
- array = glGenVertexArrays(1)[0]
44
- glBindVertexArray(array)
45
- glBindBuffer(GL_ARRAY_BUFFER, buffer)
46
- glEnableVertexAttribArray(0)
47
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
48
-
49
- glBindVertexArray(0)
50
- glBindBuffer(GL_ARRAY_BUFFER, 0)
51
-
52
- array
53
- end
54
-
55
- @program = begin
56
- vertex_shader = glCreateShader(:vertex)
57
- glShaderSource(vertex_shader, VS_CODE)
58
- glCompileShader(vertex_shader)
59
- err_msg = glGetShaderInfoLog(vertex_shader)
60
- unless glIsShaderCompiled?(vertex_shader)
61
- raise RuntimeError, "vertex_shader:\n#{err_msg}"
62
- else
63
- $stderr.puts "vertex_shader:\n#{err_msg}"
64
- end
65
-
66
- fragment_shader = glCreateShader(:fragment)
67
- glShaderSource(fragment_shader, FS_CODE)
68
- glCompileShader(fragment_shader)
69
- err_msg = glGetShaderInfoLog(fragment_shader)
70
- unless glIsShaderCompiled?(fragment_shader)
71
- raise RuntimeError, "fragment_shader:\n#{err_msg}"
72
- else
73
- $stderr.puts "fragment_shader:\n#{err_msg}"
74
- end
75
-
76
- program = glCreateProgram()
77
- glAttachShader(program, vertex_shader)
78
- glAttachShader(program, fragment_shader)
79
- glBindAttribLocation(program, 0, "in_Position")
80
- glBindFragDataLocation(program, 0, "fs_FragColor")
81
- glLinkProgram(program)
82
- err_msg = glGetProgramInfoLog(program)
83
- unless glIsProgramLinked?(program)
84
- raise RuntimeError, "program:\n#{err_msg}"
85
- else
86
- $stderr.puts "program:\n#{err_msg}"
87
- end
88
- glDeleteShader(vertex_shader)
89
- glDeleteShader(fragment_shader)
90
- program
91
- end
92
-
93
- @texture = begin
94
- texture = glGenTextures(1)[0]
95
-
96
- width, height = [32, 32]
97
- data_ptr = FFI::MemoryPointer.new(:uint32, width * height)
98
- (0...height).each do |y|
99
- (0...width).each do |x|
100
- color = (x + y) % 2 == 0 ? 0x0 : 0xffffffff
101
- if (((Float(x)/width)**2) + ((Float(y)/height)**2)) <= 1.0
102
- color = 0xff0000ff
103
- end
104
- data_ptr.put_uint32(4*(y*width+x), color)
105
- end
106
- end
107
-
108
- glBindTexture(GL_TEXTURE_2D, texture)
109
- glTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
110
- GL_BGRA, GL_UNSIGNED_BYTE, data_ptr
111
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
112
- glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, [GL_NEAREST])
113
-
114
- glBindTexture(GL_TEXTURE_2D, 0)
115
-
116
- texture
117
- end
118
-
119
- glutMainLoop()
120
- end
121
-
122
- def draw
123
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
124
-
125
- glUseProgram(@program)
126
- if (loc = glGetUniformLocation(@program, "u_Texture")) > -1
127
- glUniform1i(loc, 0)
128
- end
129
-
130
- glActiveTexture(GL_TEXTURE0)
131
- glBindTexture(GL_TEXTURE_2D, @texture)
132
-
133
- glBindVertexArray(@quad)
134
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
135
-
136
- glutSwapBuffers()
137
- end
138
-
139
- VS_CODE =<<-GLSL
140
- #version 150 core
141
- in vec4 in_Position;
142
- out vec2 vs_TexCoord;
143
- void main()
144
- {
145
- gl_Position = in_Position;
146
- vs_TexCoord = in_Position.xy + 0.5;
147
- }
148
- GLSL
149
-
150
- FS_CODE =<<-GLSL
151
- #version 150 core
152
- in vec2 vs_TexCoord;
153
- out vec4 fs_FragColor;
154
- uniform sampler2D u_Texture;
155
- void main()
156
- {
157
- fs_FragColor = texture(u_Texture, vs_TexCoord);
158
- }
159
- GLSL
160
-
161
- end
162
-
163
- TestApp.new.start
@@ -1,284 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'opengl'
4
- require 'glut'
5
- require_relative 'math3d'
6
-
7
- class TestApp
8
- include GLUT
9
- include OpenGL::Constants
10
-
11
- def initialize
12
- glutInit()
13
- caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
14
- if FFI::Platform.mac?
15
- caps |= GLUT_4_0_CORE_PROFILE
16
- else
17
- glutInitContextVersion(4, 0)
18
- glutInitContextProfile(:core)
19
- end
20
- glutInitDisplayMode(caps)
21
- glutInitWindowPosition(300, 200)
22
- glutInitWindowSize(512, 512)
23
- glutCreateWindow('tessellation')
24
-
25
- glutDisplayFunc(@draw_method ||= method(:draw))
26
- glutReshapeFunc(@resize_method ||= method(:resize))
27
- glutMouseFunc(@mouse_press_method ||= method(:mouse_press))
28
- glutMotionFunc(@mouse_track_method ||= method(:mouse_track))
29
- end
30
-
31
- def start
32
- self.extend OpenGL::GL.entrypoints
33
- puts glGetString(GL_VERSION)
34
-
35
- @quad = begin
36
- vertex_buffer, index_buffer = glGenBuffers(2)
37
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
38
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer)
39
- n, m = 4, 4
40
- @quad_count = 4*m*n
41
- glBufferData(GL_ARRAY_BUFFER, 4*2*(n+1)*(m+1), nil, GL_STATIC_DRAW)
42
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*@quad_count, nil, GL_STATIC_DRAW)
43
- glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
44
- inv_n, inv_m, off = 1.0/n, 1.0/m, 0
45
- 0.upto(m) do |i|
46
- y = 0.5 - i * inv_m
47
- 0.upto(n) do |j|
48
- x = j * inv_n - 0.5
49
- ptr.put_array_of_GLfloat(off, [x, y])
50
- off += 4*2
51
- end
52
- end
53
- end
54
- glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
55
- off = 0
56
- 0.upto(m-1) do |i|
57
- 0.upto(n-1) do |j|
58
- v0 = i*(n+1)+j
59
- ptr.put_array_of_GLushort(off, [v0, v0+n+1, v0+n+2, v0+1])
60
- off += 2*4
61
- end
62
- end
63
- end
64
-
65
- array = glGenVertexArrays(1)[0]
66
- glBindVertexArray(array)
67
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
68
- glEnableVertexAttribArray(0)
69
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nil)
70
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer)
71
-
72
- glBindVertexArray(0)
73
- glBindBuffer(GL_ARRAY_BUFFER, 0)
74
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
75
-
76
- array
77
- end
78
-
79
- @program = begin
80
- vertex_shader = glCreateShader(:vertex)
81
- glShaderSource(vertex_shader, VS_CODE)
82
- glCompileShader(vertex_shader)
83
- unless glIsShaderCompiled?(vertex_shader)
84
- msg = glGetShaderInfoLog(vertex_shader)
85
- raise RuntimeError, "vertex_shader:\n#{msg}"
86
- end
87
-
88
- tess_control_shader = glCreateShader(:tess_control)
89
- glShaderSource(tess_control_shader, TC_CODE)
90
- glCompileShader(tess_control_shader)
91
- unless glIsShaderCompiled?(tess_control_shader)
92
- msg = glGetShaderInfoLog(tess_control_shader)
93
- raise RuntimeError, "tess_control_shader:\n#{msg}"
94
- end
95
-
96
- tess_eval_shader = glCreateShader(:tess_eval)
97
- glShaderSource(tess_eval_shader, TE_CODE)
98
- glCompileShader(tess_eval_shader)
99
- unless glIsShaderCompiled?(tess_eval_shader)
100
- msg = glGetShaderInfoLog(tess_eval_shader)
101
- raise RuntimeError, "tess_eval_shader:\n#{msg}"
102
- end
103
-
104
- geometry_shader = glCreateShader(:geometry)
105
- glShaderSource(geometry_shader, GS_CODE)
106
- glCompileShader(geometry_shader)
107
- unless glIsShaderCompiled?(geometry_shader)
108
- msg = glGetShaderInfoLog(geometry_shader)
109
- raise RuntimeError, "geometry_shader:\n#{msg}"
110
- end
111
-
112
- fragment_shader = glCreateShader(:fragment)
113
- glShaderSource(fragment_shader, FS_CODE)
114
- glCompileShader(fragment_shader)
115
- unless glIsShaderCompiled?(fragment_shader)
116
- msg = glGetShaderInfoLog(fragment_shader)
117
- raise RuntimeError, "fragment_shader:\n#{msg}"
118
- end
119
-
120
- program = glCreateProgram()
121
- glAttachShader(program, vertex_shader)
122
- glAttachShader(program, tess_control_shader)
123
- glAttachShader(program, tess_eval_shader)
124
- glAttachShader(program, geometry_shader)
125
- glAttachShader(program, fragment_shader)
126
- glLinkProgram(program)
127
- unless glIsProgramLinked?(program)
128
- msg = glGetProgramInfoLog(program)
129
- raise RuntimeError, "program:\n#{msg}"
130
- end
131
- glDeleteShader(vertex_shader)
132
- glDeleteShader(tess_control_shader)
133
- glDeleteShader(tess_eval_shader)
134
- glDeleteShader(geometry_shader)
135
- glDeleteShader(fragment_shader)
136
- program
137
- end
138
-
139
- @view = Matrix.translate(0, 0, -5)
140
- @world = Matrix.scale(5, 5, 5)
141
-
142
- glutMainLoop()
143
- end
144
-
145
- def draw
146
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
147
-
148
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
149
-
150
- glUseProgram(@program)
151
- if (loc = glGetUniformLocation(@program, "u_Projection")) != -1
152
- OpenGL::Type.GLfloat(16) do |ptr|
153
- ptr.write_array_of_GLfloat(@projection.to_a.flatten)
154
- glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
155
- end
156
- end
157
- if (loc = glGetUniformLocation(@program, "u_ModelView")) != -1
158
- OpenGL::Type.GLfloat(16) do |ptr|
159
- modelview = @view * @world
160
- ptr.write_array_of_GLfloat(modelview.to_a.flatten)
161
- glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
162
- end
163
- end
164
- glPatchParameteri(GL_PATCH_VERTICES, 4)
165
-
166
- glBindVertexArray(@quad)
167
- glDrawElements(GL_PATCHES, @quad_count, GL_UNSIGNED_SHORT, nil)
168
-
169
- glutSwapBuffers()
170
- end
171
-
172
- def resize(width, height)
173
- glViewport(0, 0, width, height)
174
-
175
- fovy = 45.0 / 180.0 * Math::PI
176
- aspect = Float(width) / Float(height)
177
- z_near, z_far = 1.0, 100.0
178
- @projection = Matrix.perspective(fovy, aspect, z_near, z_far)
179
- end
180
-
181
- def mouse_press(button, button_state, x, y)
182
- if button == :LEFT
183
- case button_state
184
- when :DOWN
185
- @mouse_tracking_pos = [x, y]
186
- when :UP
187
- remove_instance_variable(:@mouse_tracking_pos)
188
- end
189
- end
190
- end
191
-
192
- def mouse_track(x, y)
193
- if defined? @mouse_tracking_pos
194
- delta_x = (x - @mouse_tracking_pos[0]) * 0.01
195
- delta_y = (y - @mouse_tracking_pos[1]) * 0.01
196
-
197
- #@world = Matrix.rotate_x(delta_y) * Matrix.rotate_y(delta_x) * @world
198
- @world = Matrix.translate(0,0,delta_y) * @world
199
-
200
- @mouse_tracking_pos = [x, y]
201
- glutPostRedisplay()
202
- end
203
- end
204
-
205
- VS_CODE =<<-GLSL
206
- #version 400 core
207
- uniform mat4 u_Projection;
208
- uniform mat4 u_ModelView;
209
- layout(location = 0) in vec4 in_Position;
210
- //out vec3 vs_Position;
211
- //out vec2 vs_TexCoord;
212
- void main()
213
- {
214
- gl_Position = u_Projection * u_ModelView * in_Position;
215
- //vs_Position = in_Position.xyz;
216
- //vs_TexCoord = in_Position.xy + 0.5;
217
- }
218
- GLSL
219
-
220
- TC_CODE =<<-GLSL
221
- #version 400 core
222
- layout(vertices=4) out;
223
- #define ID gl_InvocationID
224
- void main()
225
- {
226
- gl_out[ID].gl_Position = gl_in[ID].gl_Position;
227
- if (ID == 0) {
228
- float sum = 0.0;
229
- for (int i = 0; i < 4; ++i) {
230
- vec4 v = gl_in[i].gl_Position;
231
- sum += v.z / v.w;
232
- }
233
- sum *= 0.25;
234
- float k = 20 * clamp(1.0 - sum, 0.0, 2.0);
235
- gl_TessLevelInner[0] = k;
236
- gl_TessLevelInner[1] = k;
237
- gl_TessLevelOuter[0] = k;
238
- gl_TessLevelOuter[1] = k;
239
- gl_TessLevelOuter[2] = k;
240
- gl_TessLevelOuter[3] = k;
241
- }
242
- }
243
- GLSL
244
-
245
- TE_CODE =<<-GLSL
246
- #version 400 core
247
- layout(quads, fractional_even_spacing, ccw) in;
248
- void main()
249
- {
250
- float u = gl_TessCoord.x, v = gl_TessCoord.y;
251
- vec4 upper = mix(gl_in[0].gl_Position, gl_in[3].gl_Position, v);
252
- vec4 lower = mix(gl_in[1].gl_Position, gl_in[2].gl_Position, v);
253
- gl_Position = mix(upper, lower, u);
254
- }
255
- GLSL
256
-
257
- GS_CODE =<<-GLSL
258
- #version 400 core
259
- layout(triangles) in;
260
- layout(triangle_strip, max_vertices=3) out;
261
- void main()
262
- {
263
- for (int i = 0; i < 3; ++i) {
264
- gl_Position = gl_in[i].gl_Position;
265
- EmitVertex();
266
- }
267
- EndPrimitive();
268
- }
269
- GLSL
270
-
271
- FS_CODE =<<-GLSL
272
- #version 400 core
273
- //in vec2 vs_TexCoord;
274
- layout(location = 0) out vec4 fs_FragColor;
275
- void main()
276
- {
277
- //fs_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
278
- fs_FragColor = vec4(1.0);
279
- }
280
- GLSL
281
-
282
- end
283
-
284
- TestApp.new.start
@@ -1,263 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'opengl'
4
- require 'glut'
5
- require_relative 'math3d'
6
-
7
- class TestApp
8
- include GLUT
9
- include OpenGL::Constants
10
-
11
- def initialize
12
- glutInit()
13
- caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
14
- if FFI::Platform.mac?
15
- caps |= GLUT_4_0_CORE_PROFILE
16
- else
17
- glutInitContextVersion(4, 0)
18
- glutInitContextProfile(:core)
19
- end
20
- glutInitDisplayMode(caps)
21
- glutInitWindowPosition(300, 200)
22
- glutInitWindowSize(512, 512)
23
- glutCreateWindow('tessellation')
24
-
25
- glutDisplayFunc(@draw_method ||= method(:draw))
26
- glutReshapeFunc(@resize_method ||= method(:resize))
27
- glutMouseFunc(@mouse_press_method ||= method(:mouse_press))
28
- glutMotionFunc(@mouse_track_method ||= method(:mouse_track))
29
- end
30
-
31
- def start
32
- self.extend OpenGL::GL.entrypoints
33
- puts glGetString(GL_VERSION)
34
-
35
- @triangle = begin
36
- vertex_buffer = glGenBuffers(1)[0]
37
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
38
- glBufferData(GL_ARRAY_BUFFER, 4*2*3, nil, GL_STATIC_DRAW)
39
- glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
40
- r = 1.0
41
- s = Math.sqrt(0.75) * r
42
- ptr.put_array_of_GLfloat(0, [0.0, r])
43
- ptr.put_array_of_GLfloat(8, [s, -0.5*r])
44
- ptr.put_array_of_GLfloat(16, [-s, -0.5*r])
45
- end
46
-
47
- array = glGenVertexArrays(1)[0]
48
- glBindVertexArray(array)
49
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
50
- glEnableVertexAttribArray(0)
51
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nil)
52
-
53
- glBindVertexArray(0)
54
- glBindBuffer(GL_ARRAY_BUFFER, 0)
55
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
56
-
57
- array
58
- end
59
-
60
- @program = begin
61
- vertex_shader = glCreateShader(:vertex)
62
- glShaderSource(vertex_shader, VS_CODE)
63
- glCompileShader(vertex_shader)
64
- unless glIsShaderCompiled?(vertex_shader)
65
- msg = glGetShaderInfoLog(vertex_shader)
66
- raise RuntimeError, "vertex_shader:\n#{msg}"
67
- end
68
-
69
- tess_control_shader = glCreateShader(:tess_control)
70
- glShaderSource(tess_control_shader, TC_CODE)
71
- glCompileShader(tess_control_shader)
72
- unless glIsShaderCompiled?(tess_control_shader)
73
- msg = glGetShaderInfoLog(tess_control_shader)
74
- raise RuntimeError, "tess_control_shader:\n#{msg}"
75
- end
76
-
77
- tess_eval_shader = glCreateShader(:tess_eval)
78
- glShaderSource(tess_eval_shader, TE_CODE)
79
- glCompileShader(tess_eval_shader)
80
- unless glIsShaderCompiled?(tess_eval_shader)
81
- msg = glGetShaderInfoLog(tess_eval_shader)
82
- raise RuntimeError, "tess_eval_shader:\n#{msg}"
83
- end
84
-
85
- geometry_shader = glCreateShader(:geometry)
86
- glShaderSource(geometry_shader, GS_CODE)
87
- glCompileShader(geometry_shader)
88
- unless glIsShaderCompiled?(geometry_shader)
89
- msg = glGetShaderInfoLog(geometry_shader)
90
- raise RuntimeError, "geometry_shader:\n#{msg}"
91
- end
92
-
93
- fragment_shader = glCreateShader(:fragment)
94
- glShaderSource(fragment_shader, FS_CODE)
95
- glCompileShader(fragment_shader)
96
- unless glIsShaderCompiled?(fragment_shader)
97
- msg = glGetShaderInfoLog(fragment_shader)
98
- raise RuntimeError, "fragment_shader:\n#{msg}"
99
- end
100
-
101
- program = glCreateProgram()
102
- glAttachShader(program, vertex_shader)
103
- glAttachShader(program, tess_control_shader)
104
- glAttachShader(program, tess_eval_shader)
105
- glAttachShader(program, geometry_shader)
106
- glAttachShader(program, fragment_shader)
107
- glLinkProgram(program)
108
- unless glIsProgramLinked?(program)
109
- msg = glGetProgramInfoLog(program)
110
- raise RuntimeError, "program:\n#{msg}"
111
- end
112
- glDeleteShader(vertex_shader)
113
- glDeleteShader(tess_control_shader)
114
- glDeleteShader(tess_eval_shader)
115
- glDeleteShader(geometry_shader)
116
- glDeleteShader(fragment_shader)
117
- program
118
- end
119
-
120
- @view = Matrix.translate(0, 0, -5)
121
- @world = Matrix.scale(5, 5, 5)
122
-
123
- glutMainLoop()
124
- end
125
-
126
- def draw
127
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
128
-
129
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
130
-
131
- glUseProgram(@program)
132
- if (loc = glGetUniformLocation(@program, "u_Projection")) != -1
133
- OpenGL::Type.GLfloat(16) do |ptr|
134
- ptr.write_array_of_GLfloat(@projection.to_a.flatten)
135
- glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
136
- end
137
- end
138
- if (loc = glGetUniformLocation(@program, "u_ModelView")) != -1
139
- OpenGL::Type.GLfloat(16) do |ptr|
140
- modelview = @view * @world
141
- ptr.write_array_of_GLfloat(modelview.to_a.flatten)
142
- glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
143
- end
144
- end
145
- glPatchParameteri(GL_PATCH_VERTICES, 3)
146
-
147
- glBindVertexArray(@triangle)
148
- glDrawArrays(GL_PATCHES, 0, 3)
149
-
150
- glutSwapBuffers()
151
- end
152
-
153
- def resize(width, height)
154
- glViewport(0, 0, width, height)
155
-
156
- fovy = 45.0 / 180.0 * Math::PI
157
- aspect = Float(width) / Float(height)
158
- z_near, z_far = 1.0, 100.0
159
- @projection = Matrix.perspective(fovy, aspect, z_near, z_far)
160
- end
161
-
162
- def mouse_press(button, button_state, x, y)
163
- if button == :LEFT
164
- case button_state
165
- when :DOWN
166
- @mouse_tracking_pos = [x, y]
167
- when :UP
168
- remove_instance_variable(:@mouse_tracking_pos)
169
- end
170
- end
171
- end
172
-
173
- def mouse_track(x, y)
174
- if defined? @mouse_tracking_pos
175
- delta_x = (x - @mouse_tracking_pos[0]) * 0.01
176
- delta_y = (y - @mouse_tracking_pos[1]) * 0.01
177
-
178
- #@world = Matrix.rotate_x(delta_y) * Matrix.rotate_y(delta_x) * @world
179
- @world = Matrix.translate(0,0,delta_y) * @world
180
-
181
- @mouse_tracking_pos = [x, y]
182
- glutPostRedisplay()
183
- end
184
- end
185
-
186
- VS_CODE =<<-GLSL
187
- #version 400 core
188
- uniform mat4 u_Projection;
189
- uniform mat4 u_ModelView;
190
- layout(location = 0) in vec4 in_Position;
191
- //out vec3 vs_Position;
192
- //out vec2 vs_TexCoord;
193
- void main()
194
- {
195
- gl_Position = u_Projection * u_ModelView * in_Position;
196
- //vs_Position = in_Position.xyz;
197
- //vs_TexCoord = in_Position.xy + 0.5;
198
- }
199
- GLSL
200
-
201
- TC_CODE =<<-GLSL
202
- #version 400 core
203
- layout(vertices=3) out;
204
- #define ID gl_InvocationID
205
- void main()
206
- {
207
- gl_out[ID].gl_Position = gl_in[ID].gl_Position;
208
- if (ID == 0) {
209
- float sum = 0.0;
210
- for (int i = 0; i < 3; ++i) {
211
- vec4 v = gl_in[i].gl_Position;
212
- sum += v.z / v.w;
213
- }
214
- sum /= 3;
215
- float k = 40 * clamp(1.0 - sum, 0.0, 2.0);
216
- gl_TessLevelInner[0] = k;
217
- gl_TessLevelOuter[0] = k;
218
- gl_TessLevelOuter[1] = k;
219
- gl_TessLevelOuter[2] = k;
220
- }
221
- }
222
- GLSL
223
-
224
- TE_CODE =<<-GLSL
225
- #version 400 core
226
- layout(triangles, fractional_even_spacing, ccw) in;
227
- void main()
228
- {
229
- vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
230
- vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
231
- vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
232
- gl_Position = p0 + p1 + p2;
233
- }
234
- GLSL
235
-
236
- GS_CODE =<<-GLSL
237
- #version 400 core
238
- layout(triangles) in;
239
- layout(triangle_strip, max_vertices=3) out;
240
- void main()
241
- {
242
- for (int i = 0; i < 3; ++i) {
243
- gl_Position = gl_in[i].gl_Position;
244
- EmitVertex();
245
- }
246
- EndPrimitive();
247
- }
248
- GLSL
249
-
250
- FS_CODE =<<-GLSL
251
- #version 400 core
252
- //in vec2 vs_TexCoord;
253
- layout(location = 0) out vec4 fs_FragColor;
254
- void main()
255
- {
256
- //fs_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
257
- fs_FragColor = vec4(1.0);
258
- }
259
- GLSL
260
-
261
- end
262
-
263
- TestApp.new.start