docs: def createAllShaders(self):
          "Purpose: Creates all the shaders used by HelloVR SDL"
          self.m_unSceneProgramID = self.compileGLShader( 
              "Scene",
              # Vertex Shader
              dedent("""\
              #version 410
              uniform mat4 matrix;
              layout(location = 0) in vec4 position;
              layout(location = 1) in vec2 v2UVcoordsIn;
              layout(location = 2) in vec3 v3NormalIn;
              out vec2 v2UVcoords;
              void main()
              {
                  v2UVcoords = v2UVcoordsIn;
                  gl_Position = matrix * position;
              }
              """),
              # Fragment Shader
              dedent("""\
              #version 410 core
              uniform sampler2D mytexture;
              in vec2 v2UVcoords;
              out vec4 outputColor;
              void main()
              {
                 outputColor = texture(mytexture, v2UVcoords);
              }
              """)
              )
          self.m_nSceneMatrixLocation = glGetUniformLocation( self.m_unSceneProgramID, "matrix" )
          if self.m_nSceneMatrixLocation == -1:
              dprintf( "Unable to find matrix uniform in scene shader\n" )
              return False
          self.m_unControllerTransformProgramID = self.compileGLShader(
              "Controller",
              # vertex shader
              dedent("""\
              #version 410
              uniform mat4 matrix;
              layout(location = 0) in vec4 position;
              layout(location = 1) in vec3 v3ColorIn;
              out vec4 v4Color;
              void main()
              {
                  v4Color.xyz = v3ColorIn;
                  v4Color.a = 1.0;
                  gl_Position = matrix * position;
              }
              """),
              # fragment shader
              dedent("""\
              #version 410
              in vec4 v4Color;
              out vec4 outputColor;
              void main()
              {
                 outputColor = v4Color;
              }
              """) )
          self.m_nControllerMatrixLocation = glGetUniformLocation( self.m_unControllerTransformProgramID, "matrix" )
          if self.m_nControllerMatrixLocation == -1:
              dprintf( "Unable to find matrix uniform in controller shader\n" )
              return False
          self.m_unRenderModelProgramID = self.compileGLShader( 
              "render model",
              # vertex shader
              dedent("""\
              #version 410
              uniform mat4 matrix;
              layout(location = 0) in vec4 position;
              layout(location = 1) in vec3 v3NormalIn;
              layout(location = 2) in vec2 v2TexCoordsIn;
              out vec2 v2TexCoord;
              void main()
              {
                  v2TexCoord = v2TexCoordsIn;
                  gl_Position = matrix * vec4(position.xyz, 1);
              }
              """),
              #fragment shader
              dedent("""\
              #version 410 core
              uniform sampler2D diffuse;
              in vec2 v2TexCoord;
              out vec4 outputColor;
              void main()
              {
                 outputColor = texture( diffuse, v2TexCoord);
              }
              """) )
          self.m_nRenderModelMatrixLocation = glGetUniformLocation( self.m_unRenderModelProgramID, "matrix" )
          if self.m_nRenderModelMatrixLocation == -1:
              dprintf( "Unable to find matrix uniform in render model shader\n" )
              return False
          self.m_unLensProgramID = self.compileGLShader(
              "Distortion",
              # vertex shader
              dedent("""\
              #version 410 core
              layout(location = 0) in vec4 position;
              layout(location = 1) in vec2 v2UVredIn;
              layout(location = 2) in vec2 v2UVGreenIn;
              layout(location = 3) in vec2 v2UVblueIn;
              noperspective  out vec2 v2UVred;
              noperspective  out vec2 v2UVgreen;
              noperspective  out vec2 v2UVblue;
              void main()
              {
                  v2UVred = v2UVredIn;
                  v2UVgreen = v2UVGreenIn;
                  v2UVblue = v2UVblueIn;
                  gl_Position = position;
              }
              """),
              # fragment shader
              dedent("""\
              #version 410 core
              uniform sampler2D mytexture;
      
              noperspective  in vec2 v2UVred;
              noperspective  in vec2 v2UVgreen;
              noperspective  in vec2 v2UVblue;
      
              out vec4 outputColor;
      
              void main()
              {
                  float fBoundsCheck = ( 
                      (dot( vec2( lessThan( v2UVgreen.xy, vec2(0.05, 0.05)) ), vec2(1.0, 1.0))
                      + dot( vec2( greaterThan( v2UVgreen.xy, vec2( 0.95, 0.95)) ), vec2(1.0, 1.0))) 
                      );
                  if( fBoundsCheck > 1.0 ) {
                      outputColor = vec4( 0, 0, 0, 1.0 ); 
                  } 
                  else {
                      float red = texture(mytexture, v2UVred).x;
                      float green = texture(mytexture, v2UVgreen).y;
                      float blue = texture(mytexture, v2UVblue).z;
                      outputColor = vec4( red, green, blue, 1.0  ); 
                  }
              }
              """) )
          return self.m_unSceneProgramID != 0 and self.m_unControllerTransformProgramID != 0 and self.m_unRenderModelProgramID != 0 and self.m_unLensProgramID != 0