Basic vertex shader not working

Started by ic5y, April 15, 2013, 15:20:57

Previous topic - Next topic

ic5y

Hi!

I try to use a very basic vertex shader, but it won't show the correct output (I see nothing from my hexagon). Without it, I can successfully draw it with DrawArrays. If I comment out not to include the vertex shader in the shader program, the fragment shader correctly colors the shape

#version 150

in vec3 inPosition;
out vec4 passColor;

void main()
{
	gl_Position = vec4(inPosition,1.0);
	passColor = vec4(0.5,0.3,0.8,1.0);
}


Code for the generation and draw of hexa:

public void render()
	{
		GL20.glUseProgram(ShaderManager.getShader("SimpleColor").getID());
		GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
		
		glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboid);
		GL20.glEnableVertexAttribArray(0);
		GL11.glDrawArrays(GL11.GL_POLYGON, 0, 6);
		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
		
		GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
		GL20.glUseProgram(0);
	}
	
	public void generateMesh(float ox, float oz)
	{
		vboid = glGenBuffersARB();
		
		FloatBuffer vb = BufferUtils.createFloatBuffer(6 * 3);
		
		vb.put(ox + r).put(0).put(oz);
		vb.put(ox + a).put(0).put(oz + h);
		vb.put(ox + a).put(0).put(oz + h + s);
		vb.put(ox + r).put(0).put(oz + b);
		vb.put(ox).put(0).put(oz + h + s);
		vb.put(ox).put(0).put(oz + h);
		
		vb.flip();
		
		GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
		
		glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboid);
		
		glBufferDataARB(GL_ARRAY_BUFFER_ARB, vb, GL_STATIC_DRAW_ARB);
		GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
		
		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
		
		GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
		
		center = new Vector2f(ox + r, oz + h + (s / 2));
	}

quew8

As far as I can see you do not setup your pointers to inPosition (glVertexAttribPointer)

ic5y

And where should I put the pointer setup?

quew8


ic5y

Okay, yesterday and today I tried to solve it, but without any success...

I modified the Node class to use the GL15 vbos, not the ARB ones.

public void render()
	{
		GL20.glUseProgram(ShaderManager.getShader("SimpleColor").getID());
		
		GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboid);
		GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
		GL11.glDrawArrays(GL11.GL_POLYGON, 0, 6);
		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
		GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
		GL20.glUseProgram(0);
	}
	
	public void generateMesh(float ox, float oz)
	{
		vboid = GL15.glGenBuffers();
		
		FloatBuffer vb = BufferUtils.createFloatBuffer(6 * 3);
		
		vb.put(ox + r).put(0).put(oz);
		vb.put(ox + a).put(0).put(oz + h);
		vb.put(ox + a).put(0).put(oz + h + s);
		vb.put(ox + r).put(0).put(oz + b);
		vb.put(ox).put(0).put(oz + h + s);
		vb.put(ox).put(0).put(oz + h);
		
		vb.flip();
		
		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboid);
		GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vb, GL15.GL_STATIC_DRAW);
		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
		
		center = new Vector2f(ox + r, oz + h + (s / 2));
	}


the vertex shader is unmodified. I drop the shader class of mine, maybe the error is in that one:
package com.ic5y.shaders;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.IntBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;

public class Shader {

	private int pid;
	private int vsid;
	private int fsid;
	private String name = "";
	
	public Shader(String name, String vssource, String fssource)
	{
		this.name = name;
		
		vsid = this.loadShader("src/com/ic5y/shaders/shader_src/" + vssource, GL20.GL_VERTEX_SHADER);
		fsid = this.loadShader("src/com/ic5y/shaders/shader_src/" + fssource, GL20.GL_FRAGMENT_SHADER);
		pid = GL20.glCreateProgram();
		GL20.glAttachShader(pid, vsid);
		GL20.glAttachShader(pid, fsid);
		GL20.glLinkProgram(pid);
		GL20.glValidateProgram(pid);
	}
	
	public int loadShader(String filename, int type) {
		StringBuilder shaderSource = new StringBuilder();
		int shaderID = 0;
		
		try {
			BufferedReader reader = new BufferedReader(new FileReader(filename));
			String line;
			while ((line = reader.readLine()) != null) {
				shaderSource.append(line).append("\n");
			}
			reader.close();
		} catch (IOException e) {
			System.err.println("Could not read file.");
			e.printStackTrace();
			System.exit(-1);
		}
		
		shaderID = GL20.glCreateShader(type);
		GL20.glShaderSource(shaderID, shaderSource);
		GL20.glCompileShader(shaderID);
		
		return shaderID;
	}
	
	public int getID()
	{
		return pid;
	}
	
	public String getName()
	{
		return name;
	}
	
}

ic5y

okay, i solved it, i forgot to set the matrices.. :/