Revisited all examples and updated.
[cl-glfw.git] / examples / shader.lisp
blob5ad5693fb906d118bd1ea90db238406f9b94032f
1 (require '#:asdf)
2 (asdf:oos 'asdf:load-op '#:cl-glfw-opengl-version_2_0)
4 (defparameter *shader-program* nil)
5 (defparameter *uniform-time* nil)
7 (glfw:do-window ("An OpenGL 2.0 Shader Example")
8 ((gl:with-setup-projection
9 (glu:perspective 45 4/3 0.1 50))
10 (setf *shader-program*
11 (gl:make-program
12 (gl:make-shader gl:+vertex-shader+ "
13 varying vec3 colour;
14 void main()
16 colour = gl_Color.rgb;
17 gl_Position = ftransform();
20 (gl:make-shader gl:+fragment-shader+ "
21 uniform float time;
22 varying vec3 colour;
23 const float pi2=2.0*3.14159265;
24 void main()
26 gl_FragColor = vec4(pow(sin(colour.r*pi2*4.0+mod(time*8.0,pi2)),2.0),
27 pow(sin(colour.g*pi2*4.0+mod(time*8.0,pi2)),2.0),
28 pow(sin(colour.b*pi2*4.0+mod(time*8.0,pi2)),2.0),
29 1.0);
31 ")))
32 (gl:use-program *shader-program*)
33 (setf *uniform-time* (gl:get-uniform-location *shader-program* "time")))
34 (gl:clear gl:+color-buffer-bit+)
35 (gl:load-identity)
36 (gl:translate-f 0 0 -5)
37 (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0)
38 (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1)
39 (gl:uniform-1f *uniform-time* (coerce (glfw:get-time) 'single-float))
40 (gl:with-begin gl:+triangles+
41 (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0)
42 (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0)
43 (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0)))