When your point is at a string execute C-c C-. to get a temporary buffer in glsl-mode to edit the shader in. The convenience of a string, the benefits of a buffer.

(require 'glsl-mode)
(require 'separedit)

(defun zyd/choose-glsl-mode (fn &rest args)
  (if (eq major-mode 'lisp-mode)
      "glsl-mode"
    (apply fn args)))

(advice-add 'separedit--select-mode :around #'zyd/choose-glsl-mode)

(defun zyd/indirectly-edit ()
  (interactive)
  (let ((current-prefix-arg t))
    (separedit-dwim-default)))

(define-key slime-mode-map (kbd "C-c C-.") #'zyd/indirectly-edit)