private boolean initProgram(GL4 gl4) {

    boolean validated = true;

    // Create program
    if (validated) {

      ShaderCode vertShaderCode =
          ShaderCode.create(
              gl4,
              GL_VERTEX_SHADER,
              this.getClass(),
              SHADERS_ROOT,
              null,
              SHADERS_SOURCE,
              "vert",
              null,
              true);
      ShaderCode fragShaderCode =
          ShaderCode.create(
              gl4,
              GL_FRAGMENT_SHADER,
              this.getClass(),
              SHADERS_ROOT,
              null,
              SHADERS_SOURCE,
              "frag",
              null,
              true);

      ShaderProgram shaderProgram = new ShaderProgram();
      shaderProgram.init(gl4);
      programName[Program.VERTEX] = shaderProgram.program();
      gl4.glProgramParameteri(programName[Program.VERTEX], GL_PROGRAM_SEPARABLE, GL_TRUE);
      shaderProgram.add(vertShaderCode);
      shaderProgram.link(gl4, System.out);

      shaderProgram = new ShaderProgram();
      shaderProgram.init(gl4);
      programName[Program.FRAGMENT] = shaderProgram.program();
      gl4.glProgramParameteri(programName[Program.FRAGMENT], GL_PROGRAM_SEPARABLE, GL_TRUE);
      shaderProgram.add(fragShaderCode);
      shaderProgram.link(gl4, System.out);
    }

    if (validated) {

      gl4.glGenProgramPipelines(1, pipelineName);
      gl4.glUseProgramStages(
          pipelineName.get(0), GL_VERTEX_SHADER_BIT, programName[Program.VERTEX]);
      gl4.glUseProgramStages(
          pipelineName.get(0), GL_FRAGMENT_SHADER_BIT, programName[Program.FRAGMENT]);
    }

    return validated & checkError(gl4, "initProgram");
  }