@Override
  public void draw(GameTime gameTime) {
    GL11.glClearColor(0, 0, 0, 0);
    GL11.glClearDepth(1.0);
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

    RasterizerState.CULL_CLOCKWISE.set();
    BlendState.OPAQUE.set();
    DepthState.DEFAULT.set();

    program.use();
    texture.use(TextureUnit.Texture0, program.getUniform("Texture"));
    vb.useAsAttrib(fxsi);
    ib.bind();
    GL11.glDrawElements(PrimitiveType.Triangles, 6, GLType.UnsignedInt, 0);
    ib.unbind();
    texture.unuse();
    GLProgram.unuse();

    if (!savedImage) {
      int sw = game.getWidth();
      int sh = game.getHeight();
      ByteBuffer pb = NativeMem.createByteBuffer(sw * sh * 4);
      GL11.glReadPixels(0, 0, sw, sh, PixelFormat.Rgba, GLType.UnsignedByte, pb);
      pb.position(0);
      pb.limit(sw * sh * 4);

      byte[] cb = new byte[4];
      BufferedImage im = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_ARGB);
      for (int y = sh - 1; y >= 0; y--) {
        for (int x = 0; x < sw; x++) {
          pb.get(cb);
          im.setRGB(
              x, y, (cb[2] & 0xFF) | ((cb[1] & 0xFF) << 8) | ((cb[0] & 0xFF) << 16) | 0xFF000000);
        }
      }

      try {
        ImageIO.write(im, "png", new File("Diag.png"));
        System.out.println("Image Has Been Saved");
      } catch (IOException e) {
        System.out.println(e.getMessage());
      }

      savedImage = true;
    }
  }
  @Override
  public void build() {
    program = new GLProgram();
    program.quickCreateResource("Diag", "cs4620/util/Diag.vert", "cs4620/util/Diag.frag", null);

    fxsi =
        new ShaderInterface(
            new ArrayBind[] {
              new ArrayBind(Semantic.Position, GLType.Float, 3, 0),
              new ArrayBind(Semantic.TexCoord, GLType.Float, 2, 3 * 4)
            });
    fxsi.build(program.semanticLinks);

    vb = new GLBuffer(BufferTarget.ArrayBuffer, BufferUsageHint.StaticDraw, true);
    vb.setAsVertex(5 * 4);
    FloatBuffer vBuf = NativeMem.createFloatBuffer(4 * 5);
    vBuf.put(
        new float[] {
          -0.5f, 0.5f, 0, 0, 1, 0.5f, 0.5f, 0, 1, 1, -0.5f, -0.5f, 0, 0, 0, 0.5f, -0.5f, 0, 1, 0
        });
    vBuf.flip();
    vb.setDataInitial(vBuf);

    ib = new GLBuffer(BufferTarget.ElementArrayBuffer, BufferUsageHint.StaticDraw, true);
    ib.setAsIndexInt();
    IntBuffer iBuf = NativeMem.createIntBuffer(6);
    iBuf.put(new int[] {0, 2, 1, 1, 2, 3});
    iBuf.flip();
    ib.setDataInitial(iBuf);

    texture = new GLTexture(TextureTarget.Texture2D, true);
    texture.internalFormat = PixelInternalFormat.Rgba;
    try {
      texture.setImage2DResource("cs4620/util/Diag.png", false);
    } catch (Exception e) {
      System.out.println("NO IMAGE\r\n" + e.getMessage());
    }
  }
 @Override
 public void set(GLProgram p) {
   if (unTextureSampler == GL.BadUniformLocation) return;
   t.use(tUnit, unTextureSampler);
   SamplerState.LINEAR_CLAMP.set(TextureTarget.Texture2D);
 }