Right, although there are options to combine the two.
Shader language can be used to write raytracers running entirely on the GPU, rendering the output to merely two textured triangles streched over the screen.
However as we are talking about Clojure, not shader languages, an alternative way would be offloading some of the weight lifting to OpenGL, for example by calculating visibility using the videocard's z-buffers or creating shadow maps by rendering the scene from the lights' viewpoint into shadow buffers and using the results in the raytracer.
Shader language can be used to write raytracers running entirely on the GPU, rendering the output to merely two textured triangles streched over the screen.
However as we are talking about Clojure, not shader languages, an alternative way would be offloading some of the weight lifting to OpenGL, for example by calculating visibility using the videocard's z-buffers or creating shadow maps by rendering the scene from the lights' viewpoint into shadow buffers and using the results in the raytracer.