Skip to content

Instantly share code, notes, and snippets.

@sgithens
Created June 9, 2023 23:34
Show Gist options
  • Save sgithens/d903341c088ac5db2fa25b99c52b2d24 to your computer and use it in GitHub Desktop.
Save sgithens/d903341c088ac5db2fa25b99c52b2d24 to your computer and use it in GitHub Desktop.
transformations.lisp
(in-package :boxgl)
(defvar *vs-transforms-example*
"#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0);
ourColor = aColor;
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
")
(defun transforms-chapter-ex (&key
(vs-source *vs-transforms-example*)
(fs-source *fs-textures-brickwall*)
; (vs-source *vs-vanilla*)
; (fs-source *fs-vanilla*)
(vertices *vertices-brickwall*)
)
"The primary example in the Textures Chapter"
(let* ((gl-frame (make-instance 'boxgl-frame))
(gl-pane (slot-value gl-frame 'gl-pane))
(vs nil)
(fs nil)
(program nil)
(infolog nil)
(buffers nil)
(vertex-buffer nil)
(index-buffer nil)
(vertex-array 0)
(textures nil)
(brick-texture nil)
(smile-texture nil)
(transform-uniform nil)
(d1 nil)
(d2 nil)
(d3 nil)
(d4 nil)
(d5 nil)
(stride nil))
(capi:display gl-frame)
(opengl:rendering-on (gl-pane)
(setf vs (gl:create-shader :vertex-shader))
(gl:shader-source vs vs-source)
(gl:compile-shader vs)
(setf infolog (gl:get-shader-info-log vs))
(setf fs (gl:create-shader :fragment-shader))
(gl:shader-source fs fs-source)
(gl:compile-shader fs)
(setf d1 (gl:get-shader-info-log fs))
(setf program (gl:create-program))
(gl:attach-shader program vs)
(gl:attach-shader program fs)
(gl:link-program program)
(setf d2 (gl:get-program-info-log program))
(setf buffers (gl:gen-buffers 2))
(setf vertex-buffer (elt buffers 0))
(setf index-buffer (elt buffers 1))
; (setf textures (gl:gen-textures 2))
(setf brick-texture (gl:gen-texture));;(elt textures 0))
(setf smile-texture (gl:gen-texture));;(elt textures 1))
;; Buffer the 4 vertices for the 2 triangled rectangle
(gl:bind-buffer :array-buffer vertex-buffer)
(let ((arr (gl:alloc-gl-array :float (length vertices)))
; (verts #( 0.5 0.5 0.0
; 0.5 -0.5 0.0
; -0.5 -0.5 0.0
; -0.5 0.5 0.0))
)
(dotimes (i (length vertices))
(setf (gl:glaref arr i) (aref vertices i)))
(gl:buffer-data :array-buffer :static-draw arr)
(gl:free-gl-array arr))
(gl:bind-buffer :array-buffer 0)
;; Buffer the 2 sets of element indices to draw 2 triangles from the
;; above vertices
(gl:bind-buffer :element-array-buffer index-buffer)
(let ((arr (gl:alloc-gl-array :unsigned-short 6))
(indexes #(0 1 3
1 2 3)))
(dotimes (i (length indexes))
(setf (gl:glaref arr i) (aref indexes i)))
(gl:buffer-data :element-array-buffer :static-draw arr)
(gl:free-gl-array arr))
(gl:bind-buffer :element-array-buffer 0)
;; Setup the vertex array with the vertex buffer, vertex attributes, and index buffer
;; There are 3 vertex attributes now for vertice, color, and texture coordinate
;; The stride is 8 now, because each vertice in the vertex buffer has 8 elements,
;; three for the vertex, three for the color, and two for texture
(setf vertex-array (gl:gen-vertex-array))
(gl:bind-vertex-array vertex-array)
(gl:bind-buffer :array-buffer vertex-buffer)
(setf stride (* 8 (cffi:foreign-type-size :float)))
;; location 0: vertex
(gl:vertex-attrib-pointer 0 3 :float nil stride (cffi:null-pointer))
(gl:enable-vertex-attrib-array 0)
;; location 1: color
(gl:vertex-attrib-pointer 1 3 :float nil stride (* 3 (cffi:foreign-type-size :float)))
(gl:enable-vertex-attrib-array 1)
;; location 2: texture
(gl:vertex-attrib-pointer 2 2 :float nil stride (* 6 (cffi:foreign-type-size :float)))
(gl:enable-vertex-attrib-array 2)
(gl:bind-buffer :element-array-buffer index-buffer)
(gl:bind-vertex-array 0) ;; We're done, unbind it until we want it again
;; Set up the texture
;; brick texture
(gl:bind-texture :texture-2d brick-texture)
(gl:tex-parameter :texture-2d :texture-wrap-s :repeat)
(gl:tex-parameter :texture-2d :texture-wrap-t :repeat)
(gl:tex-parameter :texture-2d :texture-min-filter :linear)
(gl:tex-parameter :texture-2d :texture-mag-filter :linear)
(gl:tex-image-2d :texture-2d 0 :rgba 512 512 0 :rgba :unsigned-byte
(gl::gl-array-pointer (load-texture)))
(gl:generate-mipmap :texture-2d)
;; smile texture
(gl:bind-texture :texture-2d smile-texture)
(gl:tex-parameter :texture-2d :texture-wrap-s :repeat)
(gl:tex-parameter :texture-2d :texture-wrap-t :repeat)
(gl:tex-parameter :texture-2d :texture-min-filter :linear)
(gl:tex-parameter :texture-2d :texture-mag-filter :linear)
(gl:tex-image-2d :texture-2d 0 :rgba 512 512 0 :rgba :unsigned-byte
(gl::gl-array-pointer (load-texture :path "/Users/sgithens/Desktop/awesomeface.png")))
(gl:generate-mipmap :texture-2d)
(gl:use-program program)
(gl:uniformi (gl:get-uniform-location program "texture1") brick-texture)
(gl:uniformi (gl:get-uniform-location program "texture2") smile-texture)
;; Set up the transformation matrix
(setf transform-uniform (gl:get-uniform-location program "transform"))
(let ((arr (gl:alloc-gl-array :float 16))
(transform #(3.0 0.0 0.0 0.1
0.0 3.0 0.0 0.2
0.0 0.0 3.0 0.3
0.0 0.0 0.0 1.0)))
(dotimes (i (length transform))
(setf (gl:glaref arr i) (aref transform i)))
(gl:uniform-matrix-4fv transform-uniform transform) ;(gl::gl-array-pointer arr))
)
(gl:clear-color 0.2 0.3 0.3 1.0)
(gl:clear :color-buffer-bit :depth-buffer-bit)
(gl:active-texture :texture1)
(gl:bind-texture :texture-2d brick-texture)
(gl:active-texture :texture2)
(gl:bind-texture :texture-2d smile-texture)
(gl:bind-vertex-array vertex-array)
; (gl:polygon-mode :front-and-back :line)
(gl:draw-elements :triangles (gl:make-null-gl-array :unsigned-short) :count 6)
)
(print "Infolog")
(print infolog)
(print "D1")
(print d1)
(print "D2")
(print d2)
(print "huh...240")
(opengl:swap-buffers gl-pane)
gl-pane
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment