Basic shader doesn't want to color the quad

Started by
0 comments, last by robee00 11 years, 4 months ago
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
Advertisement
So awkward. I mistype a letter in the shader. I wrote gl_position instead of gl_Position

This topic is closed to new replies.

Advertisement