ashton 0.0.1alpha → 0.0.2alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/LICENSE +21 -21
  2. data/README.md +95 -68
  3. data/Rakefile +41 -23
  4. data/examples/bloom_example.rb +59 -0
  5. data/examples/lighting_example.rb +127 -0
  6. data/examples/media/SmallStar.png +0 -0
  7. data/examples/media/Starfighter.png +0 -0
  8. data/examples/media/simple.png +0 -0
  9. data/examples/noise_example.rb +94 -0
  10. data/examples/outline_example.rb +86 -0
  11. data/examples/particle_emitter_example.rb +114 -0
  12. data/examples/pixelate_example.rb +51 -49
  13. data/examples/pixelated_texture_example.rb +69 -0
  14. data/examples/radial_blur_example.rb +60 -62
  15. data/examples/shader_image_example.rb +74 -41
  16. data/examples/{shockwave2_example.rb → shockwave_example.rb} +74 -75
  17. data/examples/stencil_shader_example.rb +104 -0
  18. data/examples/{framebuffer_example.rb → texture_render_example.rb} +53 -49
  19. data/examples/{tv_screen_and_noise_example.rb → tv_screen_and_static_example.rb} +59 -59
  20. data/ext/ashton/GLee.c +18170 -0
  21. data/ext/ashton/GLee.h +17647 -0
  22. data/ext/ashton/ashton.c +42 -0
  23. data/ext/ashton/ashton.h +31 -0
  24. data/ext/ashton/color.c +45 -0
  25. data/ext/ashton/color.h +25 -0
  26. data/ext/ashton/common.h +41 -0
  27. data/ext/ashton/extconf.rb +42 -0
  28. data/ext/ashton/fast_math.c +30 -0
  29. data/ext/ashton/fast_math.h +30 -0
  30. data/ext/ashton/font.c +8 -0
  31. data/ext/ashton/font.h +16 -0
  32. data/ext/ashton/gosu.c +18 -0
  33. data/ext/ashton/gosu.h +19 -0
  34. data/ext/ashton/image.c +8 -0
  35. data/ext/ashton/image.h +16 -0
  36. data/ext/ashton/particle_emitter.c +788 -0
  37. data/ext/ashton/particle_emitter.h +171 -0
  38. data/ext/ashton/pixel_cache.c +237 -0
  39. data/ext/ashton/pixel_cache.h +58 -0
  40. data/ext/ashton/shader.c +9 -0
  41. data/ext/ashton/shader.h +16 -0
  42. data/ext/ashton/texture.c +442 -0
  43. data/ext/ashton/texture.h +63 -0
  44. data/ext/ashton/window.c +8 -0
  45. data/ext/ashton/window.h +16 -0
  46. data/lib/ashton.rb +38 -26
  47. data/lib/ashton/1.9/ashton.so +0 -0
  48. data/lib/ashton/gosu_ext/color.rb +24 -11
  49. data/lib/ashton/gosu_ext/font.rb +58 -0
  50. data/lib/ashton/gosu_ext/gosu_module.rb +16 -0
  51. data/lib/ashton/gosu_ext/image.rb +95 -31
  52. data/lib/ashton/gosu_ext/window.rb +78 -35
  53. data/lib/ashton/image_stub.rb +32 -36
  54. data/lib/ashton/lighting/light_source.rb +146 -0
  55. data/lib/ashton/lighting/manager.rb +98 -0
  56. data/lib/ashton/mixins/version_checking.rb +23 -0
  57. data/lib/ashton/particle_emitter.rb +87 -0
  58. data/lib/ashton/pixel_cache.rb +24 -0
  59. data/lib/ashton/shader.rb +353 -35
  60. data/lib/ashton/shaders/bloom.frag +41 -0
  61. data/lib/ashton/shaders/color_inversion.frag +11 -0
  62. data/lib/ashton/{post_process → shaders}/contrast.frag +16 -16
  63. data/lib/ashton/{shader → shaders}/default.frag +22 -19
  64. data/lib/ashton/{shader → shaders}/default.vert +13 -13
  65. data/lib/ashton/shaders/fade.frag +14 -0
  66. data/lib/ashton/shaders/grayscale.frag +15 -0
  67. data/lib/ashton/shaders/include/classicnoise2d.glsl +113 -0
  68. data/lib/ashton/shaders/include/classicnoise3d.glsl +177 -0
  69. data/lib/ashton/shaders/include/classicnoise4d.glsl +302 -0
  70. data/lib/ashton/{include/simplex.glsl → shaders/include/noise2d.glsl} +70 -63
  71. data/lib/ashton/shaders/include/noise3d.glsl +102 -0
  72. data/lib/ashton/shaders/include/noise4d.glsl +128 -0
  73. data/lib/ashton/shaders/include/rand.glsl +5 -0
  74. data/lib/ashton/shaders/lighting/distort.frag +57 -0
  75. data/lib/ashton/shaders/lighting/draw_shadows.frag +60 -0
  76. data/lib/ashton/shaders/lighting/shadow_blur.frag +60 -0
  77. data/lib/ashton/shaders/mezzotint.frag +22 -0
  78. data/lib/ashton/shaders/multitexture2.vert +19 -0
  79. data/lib/ashton/shaders/outline.frag +45 -0
  80. data/lib/ashton/{post_process → shaders}/pixelate.frag +48 -48
  81. data/lib/ashton/shaders/radial_blur.frag +63 -0
  82. data/lib/ashton/shaders/sepia.frag +26 -0
  83. data/lib/ashton/{post_process/shockwave2.frag → shaders/shockwave.frag} +38 -35
  84. data/lib/ashton/shaders/signed_distance_field.frag +80 -0
  85. data/lib/ashton/{post_process/noise.frag → shaders/static.frag} +25 -27
  86. data/lib/ashton/shaders/stencil.frag +27 -0
  87. data/lib/ashton/shaders/tv_screen.frag +23 -0
  88. data/lib/ashton/signed_distance_field.rb +151 -0
  89. data/lib/ashton/texture.rb +186 -0
  90. data/lib/ashton/version.rb +2 -2
  91. data/lib/ashton/window_buffer.rb +16 -0
  92. data/spec/ashton/ashton_spec.rb +22 -0
  93. data/spec/ashton/gosu_ext/color_spec.rb +34 -0
  94. data/spec/ashton/gosu_ext/font_spec.rb +57 -0
  95. data/spec/ashton/gosu_ext/gosu_spec.rb +11 -0
  96. data/spec/ashton/gosu_ext/image_spec.rb +66 -0
  97. data/spec/ashton/gosu_ext/window_spec.rb +71 -0
  98. data/spec/ashton/image_stub_spec.rb +46 -0
  99. data/spec/ashton/particle_emitter_spec.rb +123 -0
  100. data/spec/ashton/pixel_cache_spec.rb +153 -0
  101. data/spec/ashton/shader_spec.rb +152 -0
  102. data/spec/ashton/signed_distance_field_spec.rb +163 -0
  103. data/spec/ashton/texture_spec.rb +347 -0
  104. data/spec/helper.rb +12 -0
  105. metadata +159 -28
  106. data/examples/output/README.txt +0 -1
  107. data/lib/ashton/base_shader.rb +0 -172
  108. data/lib/ashton/framebuffer.rb +0 -183
  109. data/lib/ashton/post_process.rb +0 -83
  110. data/lib/ashton/post_process/default.vert +0 -9
  111. data/lib/ashton/post_process/fade.frag +0 -11
  112. data/lib/ashton/post_process/mezzotint.frag +0 -24
  113. data/lib/ashton/post_process/radial_blur.frag +0 -31
  114. data/lib/ashton/post_process/sepia.frag +0 -19
  115. data/lib/ashton/post_process/shockwave.frag +0 -40
  116. data/lib/ashton/post_process/tv_screen.frag +0 -32
@@ -1 +0,0 @@
1
- Output from the examples will be saved here, to prove that some functionality works.
@@ -1,172 +0,0 @@
1
- module Ashton
2
- # @abstract
3
- class BaseShader
4
- INVALID_LOCATION = -1
5
- MIN_OPENGL_VERSION = 2.0
6
-
7
- attr_reader :fragment_source, :vertex_source
8
-
9
- # Todo: Pass in a filename (String) or name of built-in pp shader (Symbol)
10
- #
11
- # @option options [String] :vertex Source code for vertex shader.
12
- # @option options [String] :vert equivalent to :vertex
13
- # @option options [String] :fragment Source code for fragment shader.
14
- # @option options [String] :frag equivalent to :fragment
15
- def initialize(vertex_source, fragment_source)
16
- raise "Can't instantiate abstract class" if self.class == BaseShader
17
-
18
- unless GL.version_supported? MIN_OPENGL_VERSION
19
- raise NotSupportedError, "Ashton requires OpenGL #{MIN_OPENGL_VERSION} support to utilise shaders"
20
- end
21
-
22
- @uniform_locations = {}
23
- @attribute_locations = {}
24
- @program = nil
25
-
26
- @vertex_source = vertex_source
27
- @fragment_source = fragment_source
28
-
29
- @vertex = compile GL_VERTEX_SHADER, vertex_source
30
- @fragment = compile GL_FRAGMENT_SHADER, fragment_source
31
-
32
- link
33
-
34
- glBindFragDataLocationEXT @program, 0, "out_FragColor"
35
- end
36
-
37
-
38
- # Creates a copy of the shader program, recompiling the source,
39
- # but not preserving the uniform values.
40
- def dup
41
- self.class.new :vertex => @vertex_source, :fragment => @fragment_source
42
- end
43
-
44
- # Make this the current shader program.
45
- def use
46
- previous_program = glGetIntegerv GL_CURRENT_PROGRAM
47
- glUseProgram @program
48
-
49
- if block_given?
50
- result = yield self
51
- $window.flush # TODO: need to work out how to make shader affect delayed draws.
52
- glUseProgram previous_program
53
- end
54
-
55
- result
56
- end
57
-
58
- # Disable the shader program (not needed in block version of #use).
59
- def disable
60
- glUseProgram 0 # Disable the shader!
61
- end
62
-
63
- # Is this the current shader program?
64
- def current?
65
- glGetIntegerv(GL_CURRENT_PROGRAM) == @program
66
- end
67
-
68
- # Set the value of a uniform.
69
- def []=(name, value)
70
- use do
71
- case value
72
- when true, GL_TRUE
73
- glUniform1i uniform(name), 1
74
-
75
- when false, GL_FALSE
76
- glUniform1i uniform(name), 0
77
-
78
- when Float
79
- glUniform1f uniform(name), value
80
-
81
- when Integer
82
- glUniform1i uniform(name), value
83
-
84
- when Array
85
- size = value.size
86
-
87
- raise ArgumentError, "Empty array not supported for uniform data" if size.zero?
88
- raise ArgumentError, "Only support uniforms up to 4 elements" if size > 4
89
-
90
- case value[0]
91
- when Float
92
- GL.send "glUniform#{size}f", uniform(name), *value
93
-
94
- when Integer
95
- GL.send "glUniform#{size}i", uniform(name), *value
96
-
97
- else
98
- raise ArgumentError, "Uniform data type not supported for element of type: #{value[0].class}"
99
- end
100
-
101
- else
102
- raise ArgumentError, "Uniform data type not supported for type: #{value.class}"
103
- end
104
- end
105
- end
106
-
107
-
108
-
109
- def uniform(name)
110
- location = @uniform_locations[name]
111
- if location
112
- location
113
- else
114
- location = glGetUniformLocation @program, name.to_s
115
- raise ShaderUniformError, "No #{name} uniform specified in program" if location == INVALID_LOCATION
116
- @uniform_locations[name] = location
117
- end
118
- end
119
-
120
- protected
121
- def attribute(name)
122
- location = @attribute_locations[name]
123
- if location
124
- location
125
- else
126
- location = glGetAttribLocation @program, name.to_s
127
- raise ShaderAttributeError, "No #{name} attribute specified in program" if location == INVALID_LOCATION
128
- @attribute_locations[name] = location
129
- end
130
- end
131
-
132
- protected
133
- def compile(type, source)
134
- shader = glCreateShader type
135
- glShaderSource shader, source
136
- glCompileShader shader
137
-
138
- unless glGetShaderiv shader, GL_COMPILE_STATUS
139
- error = glGetShaderInfoLog shader
140
- error_lines = error.scan(/0\((\d+)\)+/m).map {|num| num.first.to_i }.uniq
141
-
142
- if type == GL_VERTEX_SHADER
143
- type_name = "Vertex"
144
- source = @vertex_source
145
- else
146
- type_name = "Fragment"
147
- source = @fragment_source
148
- end
149
-
150
- source_lines = source.split("\n")
151
- lines = error_lines.map {|i| "#{i.to_s.rjust 3}: #{source_lines[i - 1].rstrip}" }.join "\n"
152
- raise ShaderCompileError, "#{type_name} shader error: #{glGetShaderInfoLog(shader)}\n#{lines}"
153
- end
154
-
155
- shader
156
- end
157
-
158
- protected
159
- def link
160
- @program = glCreateProgram
161
- glAttachShader @program, @vertex
162
- glAttachShader @program, @fragment
163
- glLinkProgram @program
164
-
165
- unless glGetProgramiv @program, GL_LINK_STATUS
166
- raise ShaderLinkError, "Shader link error: #{glGetProgramInfoLog(@program)}"
167
- end
168
-
169
- nil
170
- end
171
- end
172
- end
@@ -1,183 +0,0 @@
1
- module Ashton
2
- class Framebuffer
3
- TEXTURE_COORDINATES = [
4
- [0, 1], # TL
5
- [0, 0], # BL
6
- [1, 0], # TR
7
- [1, 1], # BR
8
- ]
9
-
10
- TEXTURE_COORDINATES_FLIPPED = [
11
- [0, 0], # BL
12
- [0, 1], # TL
13
- [1, 1], # BR
14
- [1, 0], # TR
15
- ]
16
-
17
- attr_reader :width, :height, :texture
18
-
19
- def initialize(width, height)
20
- @width, @height = width.to_i, height.to_i
21
- @fbo, @texture = init_framebuffer
22
-
23
- status = glCheckFramebufferStatusEXT GL_FRAMEBUFFER_EXT
24
- raise unless status == GL_FRAMEBUFFER_COMPLETE_EXT
25
-
26
- clear
27
-
28
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0
29
- glBindRenderbufferEXT GL_RENDERBUFFER_EXT, 0
30
- end
31
-
32
- # Clears the buffer to transparent.
33
- def clear(options = {})
34
- options = {
35
- color: [0.0, 0.0, 0.0, 0.0],
36
- }.merge! options
37
-
38
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, @fbo
39
-
40
- glClearColor *options[:color]
41
- glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
42
-
43
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0
44
- end
45
-
46
- # Enable the framebuffer to use (e.g. to draw or convert it).
47
- # BUG: This will force all draws performed in, AND BEFORE, the block!
48
- def use
49
- raise ArgumentError, "block required" unless block_given?
50
-
51
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, @fbo
52
- result = yield self
53
-
54
- $window.flush
55
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0
56
-
57
- result
58
- end
59
-
60
- # Draw the image, _immediately_ (no z-ordering by Gosu).
61
- #
62
- # This is not as versatile as converting the Framebuffer into a Gosu::Image and then
63
- # drawing it, but it is many times faster, so use it when you are updating the buffer
64
- # every frame, rather than just composing an image.
65
- #
66
- # Drawing in Gosu orientation will be flipped in standard OpenGL and visa versa.
67
- #
68
- # @param x [Number]
69
- # @param y [Number]
70
- # @option options :orientation [:gosu, :opengl] (:gosu)
71
- def draw x, y, options = {}
72
- options = {
73
- :orientation => :gosu,
74
- }.merge! options
75
-
76
- glEnable GL_TEXTURE_2D
77
- glBindTexture GL_TEXTURE_2D, @texture
78
-
79
- coords = case options[:orientation]
80
- when :gosu then TEXTURE_COORDINATES_FLIPPED
81
- when :opengl then TEXTURE_COORDINATES
82
- else raise ArgumentError, ":orientation option expected to be either :opengl or :gosu"
83
- end
84
-
85
- glBegin GL_QUADS do
86
- glTexCoord2d *coords[0]
87
- glVertex2d x, y + @height # BL
88
-
89
- glTexCoord2d *coords[1]
90
- glVertex2d x, y # TL
91
-
92
- glTexCoord2d *coords[2]
93
- glVertex2d x + @width, y # TR
94
-
95
- glTexCoord2d *coords[3]
96
- glVertex2d x + @width, y + @height # BR
97
- end
98
-
99
- glBindTexture GL_TEXTURE_2D, 0
100
- end
101
-
102
- # Convert the current contents of the buffer into a Gosu::Image
103
- #
104
- # @option options [Boolean] :caching (true) TexPlay behaviour.
105
- # @option options [Boolean] :tileable (false) Standard Gosu behaviour.
106
- # @option options [Array<Integer>] :rect ([0, 0, width, height]) Rectangular area of buffer to use to create the image [x, y, w, h]
107
- def to_image(options = {})
108
- options = {
109
- rect: [0, 0, @width, @height],
110
- tileable: false,
111
- }.merge! options
112
-
113
- rect = options[:rect]
114
-
115
- # Draw onto the clean flip buffer, in order to flip before saving.
116
- @fbo_flip, @fbo_flip_texture = init_framebuffer unless defined? @fbo_flip
117
-
118
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, @fbo_flip
119
- glClearColor 0, 0, 0, 0
120
- glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
121
- draw 0, 0
122
-
123
- # Read the data in the flip-buffer.
124
- glBindTexture GL_TEXTURE_2D, @fbo_flip_texture
125
- blob = glReadPixels *rect, GL_RGBA, GL_UNSIGNED_BYTE
126
-
127
- # Clean up.
128
- glBindTexture GL_TEXTURE_2D, 0
129
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0
130
-
131
- # Create a new Image from the flipped pixel data.
132
- stub = ImageStub.new blob, rect[2], rect[3]
133
- if defined? TexPlay
134
- Gosu::Image.new $window, stub, options[:tileable], options
135
- else
136
- Gosu::Image.new $window, stub, options[:tileable]
137
- end
138
-
139
- end
140
-
141
- # Create an fbo and its texture
142
- def init_framebuffer
143
- fbo = glGenFramebuffersEXT(1)[0]
144
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, fbo
145
-
146
- texture = init_framebuffer_texture
147
-
148
- glFramebufferTexture2DEXT GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture, 0
149
-
150
- [fbo, texture]
151
- end
152
-
153
- protected
154
- # Called by init_framebuffer.
155
- def init_framebuffer_texture
156
- texture = glGenTextures(1)[0]
157
- glBindTexture GL_TEXTURE_2D, texture
158
-
159
- glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE
160
- glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE
161
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST
162
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST
163
-
164
- glTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, @width, @height,
165
- 0, GL_RGBA, GL_UNSIGNED_BYTE, nil
166
-
167
- glBindTexture GL_TEXTURE_2D, 0 # Unbind the texture
168
-
169
- texture
170
- end
171
-
172
- protected
173
- def delete
174
- glDeleteFramebuffersEXT @fbo
175
- glDeleteTextures @texture
176
-
177
- glDeleteFramebuffersEXT @fbo_flip if defined? @fbo_flip
178
- glDeleteTextures @fbo_flip_texture if defined? @fbo_flip_texture
179
-
180
- glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0
181
- end
182
- end
183
- end
@@ -1,83 +0,0 @@
1
- require "ashton/base_shader"
2
-
3
- module Ashton
4
- # Process the entire screen.
5
- class PostProcess < BaseShader
6
- DEFAULT_VERTEX_SOURCE = File.read File.expand_path("../post_process/default.vert", __FILE__)
7
-
8
- class << self
9
- # Canvas used to copy out the screen before post-processing it back onto the screen.
10
- # We only need one of these, but only create it after a PostProcessor has
11
- # actually been used.
12
- def texture
13
- @texture ||= begin
14
- texture = glGenTextures(1).first
15
- glBindTexture GL_TEXTURE_2D, texture
16
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
17
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
18
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE
19
- glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE
20
- glTexImage2D GL_TEXTURE_2D, 0, GL_RGB8, $window.width, $window.height, 0,
21
- GL_RGB, GL_UNSIGNED_BYTE, "\0" * ($window.width * $window.height * 3)
22
- texture
23
- end
24
- end
25
- end
26
-
27
- # Todo: Pass in a filename (String) or name of built-in pp shader (Symbol)
28
- def initialize(fragment)
29
- super DEFAULT_VERTEX_SOURCE, fragment
30
-
31
- # Set up defaults that we won't need to change at run-time.
32
- use do
33
- # Width/height are optional.
34
- glUniform1i glGetUniformLocation(@program, "in_WindowWidth"), $window.width
35
- glUniform1i glGetUniformLocation(@program, "in_WindowHeight"), $window.height
36
-
37
- self["in_Texture"] = 0 # GL_TEXTURE0 will be activated.
38
- end
39
- end
40
-
41
- # Full screen post-processing using a fragment shader.
42
- #
43
- # It will force all previous draw operations to be flushed to the
44
- # screen, so that you can, or example, process the "game world" before you draw the GUI.
45
- #
46
- # Variables set for you in the fragment shader:
47
- # uniform sampler2D in_Texture; // Texture containing the screen image.
48
- # uniform int in_WindowWidth;
49
- # uniform int in_WindowHeight;
50
- def process
51
- $window.gl do
52
- width, height = $window.width, $window.height
53
- texture = PostProcess.texture
54
-
55
- # Copy window contents into a frame-buffer.
56
- glBindTexture GL_TEXTURE_2D, texture
57
- glCopyTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, width, height, 0
58
-
59
- # clear screen and set "normal" openGL coordinates.
60
- glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
61
- glColor4f 1.0, 1.0, 1.0, 1.0
62
- glMatrixMode GL_PROJECTION
63
- glLoadIdentity
64
- glViewport 0, 0, width, height
65
- glOrtho 0, width, height, 0, -1, 1
66
-
67
- # Assign the canvas, which was a copy of the screen.
68
- glActiveTexture GL_TEXTURE0
69
- glBindTexture GL_TEXTURE_2D, texture
70
- raise unless glGetIntegerv(GL_ACTIVE_TEXTURE) == GL_TEXTURE0
71
-
72
- use do
73
- glBegin GL_QUADS do
74
- glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 0.0)
75
- glTexCoord2f(1.0, 1.0); glVertex2f(width, 0.0)
76
- glTexCoord2f(1.0, 0.0); glVertex2f(width, height)
77
- glTexCoord2f(0.0, 0.0); glVertex2f(0.0, height)
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,9 +0,0 @@
1
- #version 110
2
-
3
- varying vec2 var_TexCoord;
4
-
5
- void main()
6
- {
7
- gl_Position = ftransform();
8
- var_TexCoord = gl_MultiTexCoord0.xy;
9
- }