(def vertex-shader "
attribute vec2 pos;
void main()
{
gl_Position = vec4(pos, 0, 1);
}")
(def fragment-shader "
precision mediump float;
void main()
{
gl_FragColor = vec4(0, 0.8, 0, 1);
}
")
(defn create-shader
[gl text type]
(let [shader (.createShader gl type)]
(.shaderSource gl shader text)
(.compileShader gl shader)
shader))
(defn create-program
[gl vstr fstr
(let [program (.createProgram gl)
vshader (create-shader gl vstr (.-VERTEX_SHADER gl))
fshader (create-shader gl fstr (.-FRAGMENT_SHADER gl))]
(.attachShader gl program vshader)
(.attachShader gl program fshader)
(.linkProgram gl program)
program))
(defn init
[]
(let [canvas (.getElementById js/document "c")
gl (.getContext canvas "experimental-webgl")
buffer (.createBuffer gl)
vertices (js/Array. -0.5 -0.5
0.5 -0.5
0 0.5)
program (create-program gl vertex-shader fragment-shader)]
(.bindBuffer gl (.-ARRAY_BUFFER gl) buffer)
(.bufferData gl (.-ARRAY_BUFFER gl) (js/Float32Array. vertices) (.-STATIC_DRAW gl))
(.useProgram gl program)
(set! (.-vertexPosAttrib program) (.getAttribLocation gl program "pos"))
(.enableVertexAttribArray gl (.-vertexPosAttrib program))
(.vertexAttribPointer gl (.-vertexPosAttrib program) 2 (.-FLOAT gl) false 0 0)
(.drawArrays gl (.-TRIANGLES gl) 0 3)))
(set! (.-onload js/window) init)