SHARE
    TWEET
    sknthelisper

    LearnOpenGL.com - Hello rectangle

    Jul 13th, 2023 (edited)
    1,114
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    Lisp 5.67 KB | Source Code | 0 0
    1. ;;;; Tutorial 01: Hello OpenGL from - https://learnopengl.com/Getting-started/Hello-Triangle
    2. ;;;; Original C source: https://learnopengl.com/code_viewer_gh.php?code=src/1.getting_started/2.2.hello_triangle_indexed/hello_triangle_indexed.cpp
    3. ;;;; Usage; Recommend using quicklisp and create an ASD file that loads this.
    4. ;;;; Dependencies: #:CL-opengl #:bt-semaphore #:Lispbuilder-sdl
    5. (defpackage #:hello-rectangle
    6. (:use #:cl)
    7. (:export :main))
    8. (in-package #:hello-rectangle)
    9. (defparameter *fps* 60)
    10. (defparameter *Width* 640)
    11. (defparameter *height* 480)
    12. (defparameter *vertex-shader-source* "
    13. #version 330 core
    14. layout (location = 0) in vec3 position;
    15. void main(){
    16. gl_Position = vec4(position.x, position.y, position.z, 1.0);
    17. }")
    18. (defparameter *fragment-shader-source* "
    19. #version 330 core
    20. out vec4 color;
    21. void main(){
    22. color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
    23. }")
    24. (defparameter *verticies-data* #( 0.5 0.5 0.0 ; Top Right
    25. 0.5 -0.5 0.0 ; Bottom Right
    26. -0.5 -0.5 0.0 ; Bottom Left
    27. -0.5 0.5 0.0)); Top Left
    28. (defparameter *indices-data* #(0 1 3 ; First Triangle
    29. 1 2 3)) ; Second Triangle
    30. (defparameter *verticies* nil)
    31. (defparameter *indices* nil)
    32. (defparameter *VBO* nil)
    33. (defparameter *VAO* nil)
    34. (defparameter *EBO* nil)
    35. (defparameter *shader-program* nil)
    36. (defun check-shader-error (shader)
    37. "Check for shader compilation errors"
    38. (let ((success (cffi:foreign-alloc :int :initial-element 0)))
    39. (unwind-protect
    40. (progn
    41. (%gl:get-shader-iv shader :compile-status success)
    42. (unless (= (cffi:mem-aref success :int) 1)
    43. (error "OpenGL Shader Error:~%~a~%" (gl:get-shader-info-log shader)))
    44. (cffi:foreign-free success)))))
    45. (defun check-program-error (program)
    46. "Check for linking errors"
    47. (let ((success (cffi:foreign-alloc :int :initial-element 0)))
    48. (unwind-protect
    49. (progn
    50. (%gl:get-program-iv program :link-status success)
    51. (unless (= (cffi:mem-aref success :int) 1)
    52. (error "OpenGL Program Error:~%~a~%" (gl:get-program-info-log program))))
    53. (cffi:foreign-free success))))
    54. (defun setup-program (vertex-Shader Fragment-Shader)
    55. "link and attach the shader programs"
    56. (let ((program (gl:create-program)))
    57. (gl:attach-shader program vertex-shader)
    58. (gl:attach-shader program fragment-shader)
    59. (gl:link-program program)
    60. (check-program-error program)
    61. (setf *shader-program* program)))
    62. (defun setup-shaders ()
    63. "Build and compile the actual shaders"
    64. (let ((vertex-shader (gl:create-shader :vertex-shader))
    65. (fragment-shader (gl:create-shader :fragment-shader)))
    66. ;; Vertex shader
    67. (gl:shader-source vertex-shader *vertex-shader-source*)
    68. (gl:compile-shader vertex-shader)
    69. (check-shader-error vertex-shader)
    70. ;; Fragment shader
    71. (gl:shader-source fragment-shader *fragment-shader-source*)
    72. (gl:compile-shader fragment-shader)
    73. (check-shader-error fragment-shader)
    74. (setup-program vertex-shader fragment-shader)
    75. (gl:delete-shader vertex-shader)
    76. (gl:delete-shader fragment-shader)))
    77. (defun setup-vertex-attributes ()
    78. "Set up vertex data (and buffer(s)) and configure vertex attributes"
    79. (setf *VBO* (gl:gen-buffer))
    80. (setf *vao* (gl:gen-vertex-array))
    81. (setf *EBO* (gl:gen-buffer))
    82. ;; Convert CL arrays into an C arrays
    83. (setf *verticies*
    84. (loop :with gl-array = (gl:alloc-gl-array :float (length *verticies-data*))
    85. :for i :below (length *verticies-data*)
    86. :do (setf (gl:glaref gl-array i) (aref *verticies-data* i))
    87. :finally (return gl-array))
    88. *indices*
    89. (loop :with gl-array = (gl:alloc-gl-array :unsigned-int (length *indices-data*))
    90. :for i :below (length *indices-data*)
    91. :do (setf (gl:glaref gl-array i) (aref *indices-data* i))
    92. :finally (return gl-array)))
    93. (gl:bind-vertex-array *vao*)
    94. (gl:bind-buffer :array-buffer *vbo*)
    95. (gl:buffer-data :array-buffer :static-draw *verticies*)
    96. (gl:bind-buffer :element-array-buffer *ebo*)
    97. (gl:buffer-data :element-array-buffer :static-draw *indices*)
    98. (gl:vertex-attrib-pointer 0 3 :float nil (* 3 (cffi:foreign-type-size :float)) 0)
    99. (gl:enable-vertex-attrib-array 0)
    100. (gl:bind-buffer :array-buffer 0)
    101. (gl:bind-vertex-array 0))
    102. (defun init-openGL ()
    103. "Gets openGL ready"
    104. (gl:clear-color .2 .3 .3 1.0)
    105. ;;(gl:polygon-mode :front-and-back :line)
    106. (setup-shaders)
    107. (setup-vertex-attributes)
    108. )
    109. (defun rendering ()
    110. "Displays the actual rectangle"
    111. (gl:clear :color-buffer-bit)
    112. (gl:use-program *shader-program*)
    113. (gl:bind-vertex-array *vao*)
    114. (%gl:draw-elements :triangles 6 :unsigned-int 0)
    115. (gl:bind-vertex-array 0)
    116. (sdl:update-display))
    117. (defun freeing-memory ()
    118. "Clear allocated memory"
    119. (gl:free-gl-array *verticies*)
    120. (gl:free-gl-array *indices*)
    121. (gl:delete-vertex-arrays '(*vao*))
    122. (gl:delete-buffers '(*vbo* *ebo* ))
    123. (gl:delete-program *shader-program*))
    124. (defun main (&aux (title "Hello Rectangle"))
    125. (bt:make-thread
    126. (lambda ()
    127. (sdl:with-init ()
    128. (unwind-protect ; ensures proper error handling in-case of crash
    129. (sdl:window *width* *height* :title-caption title :flags '(sdl:sdl-opengl)) ; Window creation with opengl rendering
    130. (setf (sdl:frame-rate) *fps*)
    131. (sdl:enable-key-repeat 100 1)
    132. (setf cl-opengl-bindings:*gl-get-proc-address* #'sdl-cffi::sdl-gl-get-proc-address) ; overwrite SDL's rendering with CL-opengl's.
    133. (init-openGL)
    134. (sdl:with-events ()
    135. (:quit-event () t)
    136. (:idle ()
    137. (rendering)))
    138. (freeing-memory)))) ;; Freeing the memory after program terminates
    139. :name title))
    Tags: opengl
    Advertisement
    Add Comment
    Please, Sign In to add comment
    Public Pastes
    We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
    Not a member of Pastebin yet?
    Sign Up, it unlocks many cool features!

    AltStyle によって変換されたページ (->オリジナル) /