Hi!
I'm started to learn LWJGL and OpenGL, and following a tutorial, my code doesn't want to color the quad.
Game.java:
[source lang="java"]public class Game{
//VARIABLES
private int vaoID = 0;
private int vboID = 0;
private int vboiID = 0; //for indices
private int vbocID = 0; //for colors
private int indicesCount = 0;
private int vsID = 0;
private int fsID = 0;
private int pID = 0;
public Game() {
try
{
Display.setDisplayMode(new DisplayMode(1280,720));
Display.create();
}
catch(LWJGLException e)
{
e.printStackTrace();
}
}
private void start()
{
init();
doMainLoop();
cleanUp();
}
private void init()
{
//initialization
GL11.glClearColor(0.4f, 0.6f, 0.9f, 0f);
GL11.glViewport(0, 0, 1280, 720);
//Default is counter-clockwise!!!
//It's not important when using Elements!
float[] vertices = {
-0.5f,0.5f,0f,1f,
-0.5f,-0.5f,0f,1f,
0.5f,-0.5f,0f,1f,
0.5f,0.5f,0f,1f
};
//OGL Buffers requires flipped byte buffers
FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(vertices.length);
verticesBuffer.put(vertices);
verticesBuffer.flip();
float[] colors = {
1f,0f,0f,1f,
0f,1f,0f,1f,
0f,0f,1f,1f,
1f,1f,1f,1f
};
FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length);
colorBuffer.put(colors);
colorBuffer.flip();
byte[] indices = {
//Left bottom
0, 1, 2,
//Right top
2, 3, 0
};
indicesCount = indices.length;
ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indicesCount);
indicesBuffer.put(indices);
indicesBuffer.flip();
//Create new VAO, and bind the data
// A VAO can have up to 16 attributes (VBO's) assigned to it by default
vaoID = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vaoID);
//Create new VBO, and bind
// A VBO is a collection of Vectors which in this case resemble the location of each vertex.
vboID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer, GL15.GL_STATIC_DRAW);
//Put the VBO in the attrib list at index 0
GL20.glVertexAttribPointer(0, 4 ,GL11.GL_FLOAT, false, 0, 0);
//Deselect (bind to 0) the VBO
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
//Create new VBO for colors
vbocID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbocID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
//Deselect (bind to 0) the VAO
GL30.glBindVertexArray(0);
//Create new VBO for indices, and bind it
vboiID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiID);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL15.GL_STATIC_DRAW);
//Deselect it
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
//Load shaders
vsID = loadShader("src/net/doubler/hexdef/basic.vs", GL20.GL_VERTEX_SHADER);
fsID = loadShader("src/net/doubler/hexdef/basic.fs", GL20.GL_FRAGMENT_SHADER);
//Create program, and apply shaders
pID = GL20.glCreateProgram();
GL20.glAttachShader(pID, vsID);
GL20.glAttachShader(pID, fsID);
GL20.glLinkProgram(pID);
//Position info will be attrib 0
GL20.glBindAttribLocation(pID, 0, "in_Position");
//Color info will be attrib 1
GL20.glBindAttribLocation(pID, 1, "in_Color");
//Validate program
GL20.glValidateProgram(pID);
}
private void doMainLoop()
{
while(!Display.isCloseRequested())
{
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL20.glUseProgram(pID);
//Bind to the VAO that has all the info about the quad vertices
GL30.glBindVertexArray(vaoID);
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
//Bind to the index VBO that has the info about the order
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiID);
//Draw the vertices
GL11.glDrawElements(GL11.GL_TRIANGLES, indicesCount, GL11.GL_UNSIGNED_BYTE, 0);
//Put everything back to default
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
GL20.glUseProgram(0);
Display.sync(60);
Display.update();
}
}
private void cleanUp()
{
//clean up every trash
//Delete shaders
GL20.glUseProgram(0);
GL20.glDetachShader(pID, vsID);
GL20.glDetachShader(pID, fsID);
GL20.glDeleteShader(vsID);
GL20.glDeleteShader(fsID);
GL20.glDeleteProgram(pID);
//Select VAO
GL30.glBindVertexArray(vaoID);
//Disable the VBO index from the VAO attrib list
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
//Delete the vertex VBO
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL15.glDeleteBuffers(vboID);
//Delete the index VBO
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
GL15.glDeleteBuffers(vboiID);
//Delete the color VBO
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL15.glDeleteBuffers(vbocID);
//Delete the VAO
GL30.glBindVertexArray(0);
GL30.glDeleteVertexArrays(vaoID);
Display.destroy();
}
public int loadShader(String name, int type)
{
StringBuilder source = new StringBuilder();
int shaderID = 0;
try
{
BufferedReader reader = new BufferedReader(new FileReader(name));
String line;
while((line = reader.readLine()) != null)
{
source.append(line).append("\n");
}
reader.close();
}
catch(IOException e)
{
e.printStackTrace();
System.exit(-1);
}
shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, source);
GL20.glCompileShader(shaderID);
return shaderID;
}
public static void main(String[] args) {
Game app = new Game();
app.start();
}
}[/source]
VertexShader:
[source lang="cpp"]#version 330
in vec4 in_Position;
in vec4 in_Color;
out vec4 pass_Color;
void main(void)
{
gl_Position = in_Position;
pass_Color = in_Color;
}[/source]
FragmentShader:
[source lang="cpp"]#version 330
in vec4 pass_Color;
out vec4 out_Color;
void main(void)
{
out_Color = pass_Color;
}[/source]
The only output I get is a white quad. It looks like the shaders are not compiling or I don't know. I tried to change out_Color to gl_FragColor, still white quad. Thanks in advance