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 330in 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 330in 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
Edited by RobeeZ, 24 November 2012 - 06:53 AM.






