def process_source(shader, extension)
      source = if shader.is_a? Symbol
                 file = File.expand_path "#{shader}#{extension}", BUILT_IN_SHADER_PATH
                 unless File.exist? file
                   raise ShaderLoadError, "Failed to load built-in shader: #{shader.inspect}"
                 end
                 File.read file

               elsif File.exist? shader
                 File.read shader
               else
                 shader
               end

      replace_include source
    end
def process_source(shader, extension)
      source = if shader.is_a? Symbol
                 file = File.expand_path "#{shader}#{extension}", BUILT_IN_SHADER_PATH
                 unless File.exist? file
                   raise ShaderLoadError, "Failed to load built-in shader: #{shader.inspect}"
                 end
                 File.read file

               elsif File.exist? shader
                 File.read shader
               else
                 shader
               end

      replace_include source
    end
Symbol => load a built-in
 Filename => load file
 Source => use directly.

 Also recursively replaces #include
 TODO: What about line numbers getting messed up by #include?