opengl3 0.0.1.pre3 → 0.0.1.pre4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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