[OpenGL] DrawArrays not working for me [Solved]

Hey guys!

I have made a 2D spritebatcher in LWJGL and it is working perfectly.
Now I am trying to make a shapeBatcher. Basicly it’s a spriteBatcher but without the textures.
But when I test it I get nothing… No errors, no shapes, nothing…
The only difference between my spritebatcher and my shapebatcher is that the shapebatcher does not use textures and it uses drawarrays instead of draw elements.

I am gonna paste the code for the shapebatcher below and if any of you can find the error I would be so happy! Been looking at it for hours…

package graphics;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;

import java.awt.Color;
import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;


public class ShapeBatcher
{
	private final static int MAX_NUMBER_OF_VERTICIES = 500;
	
	private int numberOfVerticies;
	
	private int shaderProgramID;
	private int projMatrixID;
	
	private boolean active;
	
	private int mode;
	private static final int LINEMODE = 0;
	private static final int FILLMODE = 1;
	
	private int vaoID;
	private int vboID;
	
	private FloatBuffer buffer;
	
	private Color color;
	
	public ShapeBatcher()
	{
		active = false;
		mode = LINEMODE;
		numberOfVerticies = 0;
		color = Color.WHITE;
		
		buffer = BufferUtils.createFloatBuffer(MAX_NUMBER_OF_VERTICIES*2);
		
		setupShader();
		
		setupBuffers();
	}
	
	private void setupBuffers()
	{
		//Setup VAO og aktiver de første 2 attributes
		vaoID = glGenVertexArrays();
		glBindVertexArray(vaoID);
		glEnableVertexAttribArray(0);
		glEnableVertexAttribArray(1);
				
		//Setup vertex-VBO
		vboID = glGenBuffers();
		glBindBuffer(GL_ARRAY_BUFFER, vboID);
		
		//Setup VAO pointers
		int bytesPerFloat = 4;
		int numberOfVertecies = 2;
		int numberOfColors = 4;
				
		int bytesPerVertex = (numberOfVertecies + numberOfColors) * bytesPerFloat;
		
		//Giv VAO'en vertex-VBO'en på index 0
		glVertexAttribPointer(0, 2, GL_FLOAT, false, bytesPerVertex, 0);
				
		//Giv VAO'en color-VBO'en på index 1
		int colorOffset = numberOfVertecies * bytesPerFloat;
		glVertexAttribPointer(1, 4, GL_FLOAT, false, bytesPerVertex, colorOffset);
	}
	
	private void setupShader()
	{
		//Lav vertexShaderen
		int vertexShaderID = ShaderUtils.createShader(GL_VERTEX_SHADER, "/graphics/ShapeVertexShader.txt", this);
		
		//Lav fragmentShaderen
		int fragmentShaderID = ShaderUtils.createShader(GL_FRAGMENT_SHADER, "/graphics/ShapeFragmentShader.txt", this);
		
		//Lav shaderProgrammet
		shaderProgramID = glCreateProgram();
		glAttachShader(shaderProgramID, vertexShaderID);
		glAttachShader(shaderProgramID, fragmentShaderID);
		
		//Fortæl shaderen hvor dens attributes er
		glBindAttribLocation(shaderProgramID, 0, "position");
		glBindAttribLocation(shaderProgramID, 1, "color");
		
		//Link og valider shaderProgrammet
		glLinkProgram(shaderProgramID);
		glValidateProgram(shaderProgramID);
		
		//Skaf projMatrix'ens ID
		projMatrixID = glGetUniformLocation(shaderProgramID, "projMatrix");
		if(projMatrixID == -1)
			new Exception("Kunne ikke finde projMatrixID").printStackTrace();;
		
		//Slet de to shadere igen da de ikke skal bruges mere
		glDeleteShader(vertexShaderID);
		glDeleteShader(fragmentShaderID);
	}
	
	/**
	 * Tegner en linie fra et punkt til et andet
	 * @param startX
	 * @param startY
	 * @param endX
	 * @param endY
	 */
	public void drawLine(int startX, int startY, int endX, int endY)
	{
		checkMode(LINEMODE);
		checkRender(2);
		
		float[] fColor = color.getComponents(null);
		
		//Første punkt i linien
		buffer.put(startX).put(startY);
		buffer.put(fColor);
		
		//Anden punkt i linien
		buffer.put(endX).put(endY);
		buffer.put(fColor);
		
		numberOfVerticies += 2;
	}
	
	public void fillRect(int x, int y, int width, int height)
	{
		fillTriangle(x, y, x, y+height, x+width, y+height);
		fillTriangle(x, y, x+width, y+height, x+width, y);
	}
	
	public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
	{
		checkMode(FILLMODE);
		checkRender(3);
		
		float[] c = color.getComponents(null);
		
		//Første hjørne
		buffer.put(x1).put(y1);
		buffer.put(c);
		
		//Andet hjørne
		buffer.put(x2).put(y2);
		buffer.put(c);
		
		//Tredje hjørne
		buffer.put(x3).put(y3);
		buffer.put(c);
		
		numberOfVerticies += 3;
	}
	
	/**
	 * Sender den nye projMatrix til shapeBatcherens shader.
	 * Den aktiverer dermed sin shader, så den er aktiv efter denne funktion er blevet kaldt.
	 * @param matrix
	 */
	public void resize(FloatBuffer matrix)
	{
		glUseProgram(shaderProgramID);
		matrix.flip();
		glUniformMatrix4(projMatrixID, true, matrix);
	}
	
	public void setColor(Color c)
	{
		color = c;
	}
	
	public void activate()
	{
		active = true;
		glUseProgram(shaderProgramID);
	}
	
	public void deactivate()
	{
		active = false;
	}
	
	public void render()
	{
		//Hvis shapeBatcheren ikke er aktiv, så smid en exception
		if(!active)
			new Exception("ShapeBatcher'en er ikke aktiveret rigtigt!").printStackTrace();
		
		//Hvis der ikke er noget at tegne, så return
		if(numberOfVerticies == 0)
			return;
		
		//Send data'en til vbo'en
		buffer.flip();
		glBindBuffer(GL_ARRAY_BUFFER, vboID);
		glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW);
		
		//Bind vao'en
		glBindVertexArray(vaoID);
		
		if(mode == LINEMODE)
			glDrawArrays(GL_LINES, 0, numberOfVerticies*2);
		else if(mode == FILLMODE)
			glDrawArrays(GL_TRIANGLES, 0, numberOfVerticies*3);
		
		//Reset batcheren
		buffer.clear();
		numberOfVerticies = 0;
	}
	
	/**
	 * Tjekker om der er plads til flere shapes i batcheren
	 * @param verticies Det antal verticies der skal tilføjes til batcheren
	 */
	private void checkRender(int verticies)
	{
		if(MAX_NUMBER_OF_VERTICIES < (numberOfVerticies + verticies))
			render();
	}
	
	/**
	 * Tjekker om batcheren er i den rigtige mode
	 * @param mode Den mode der skal tjekkes for
	 */
	private void checkMode(int mode)
	{
		if(this.mode != mode)
		{
			render();
			this.mode = mode;
		}
	}
}

The vertex shader:


uniform mat4 projMatrix;

in vec2 position;
in vec4 color;

out vec4 pass_color;

void main()
{	
	gl_Position = projMatrix * vec4(position, 0.0, 1.0);
	
	pass_color = color;
}

The fragment shader:


in vec4 pass_color;

out vec4 out_color;

void main()
{	
	out_color = pass_color;
}

Potato!