So I got the hang of immediate mode drawing and tried doing some basic landscape rendering with it but was not pleased with the speed so I decided to try my hand with VBOs, then having conquered VBOs I decided to try adding shaders to that, and that’s where I ran into serious trouble. I’ve been trying the last few days to get the below code to work and it compiles fine, but opengl gives me a 1281 error
this code goes in the realmain class
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GL3;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;
import javax.swing.*;
import com.jogamp.opengl.util.FPSAnimator;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
public class RealMain{
public static void main(String[] args) {
JFrame frame = new JFrame("JOGL test");
frame.setSize(640, 480);
GLProfile glProfile = GLProfile.getDefault();
GLCapabilities glCapabilities = new GLCapabilities(glProfile);
GLCanvas canvas = new GLCanvas(glCapabilities);
frame.add(canvas);
canvas.addGLEventListener(new JOGLRenderer());
FPSAnimator animator = new FPSAnimator(canvas, 60);
animator.add(canvas);
animator.start();
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0); } });
frame.setVisible(true);
}
private static class JOGLRenderer implements GLEventListener {
ShaderProgram shader;
public void init(GLAutoDrawable drawable){
shader = new ShaderProgram(drawable, new File("bin/vert.txt"), new File("bin/frag.txt"));
//setup opengl
GL3 gl = drawable.getGL().getGL3();
gl.glClearColor(0.2f, 0.2f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
// Create vertex data
float[] vertexData = new float[]{
-1f, 1f, -2.0f, //0
1f, 1f, -2.0f, //1
-1f, -1f, -2.0f, //2
1f, -1f, -2.0f, //3
};
ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(7 * 4 * 4);
vertexByteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer vertexBuffer = vertexByteBuffer.asFloatBuffer();
vertexBuffer.put(vertexData);
// Create vertex buffer
int[] vertexBufferId = new int[1];
gl.glGenBuffers(1, vertexBufferId, 0);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertexBufferId[0]);
gl.glBufferData(GL2.GL_ARRAY_BUFFER, 48, null, GL2.GL_DYNAMIC_DRAW);
// Load vertex data into vertex buffer
gl.glBufferSubData(GL2.GL_ARRAY_BUFFER, 0, vertexByteBuffer.capacity(), vertexByteBuffer);
// Create index data
int[] indexData = new int[]{0, 1, 2, 3};
ByteBuffer indexByteBuffer = ByteBuffer.allocateDirect(4 * 4);
indexByteBuffer.order(ByteOrder.nativeOrder());
IntBuffer indexBuffer = indexByteBuffer.asIntBuffer();
indexBuffer.put(indexData);
// Create index buffer
int[] indexBufferId = new int[1];
gl.glGenBuffers(1, indexBufferId, 0);
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexBufferId[0]);
gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, 16, null, GL2.GL_DYNAMIC_DRAW);
// Load index data into index buffer
gl.glBufferSubData(GL2.GL_ELEMENT_ARRAY_BUFFER, 0, indexByteBuffer.capacity(), indexByteBuffer);
}
public void dispose(GLAutoDrawable drawable){}
public void display(GLAutoDrawable drawable){
GL3 gl = drawable.getGL().getGL3();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
//gl.glMatrixMode(GL2.GL_MODELVIEW);
//gl.glLoadIdentity();
int stride = 3 * 4; //3 floats per vert * 4 bytes per float
gl.glVertexAttribPointer(gl.glGetAttribLocation(shader.p, "vertex"), 3, gl.GL_FLOAT, false, 20, 0);
System.out.println(gl.glGetError());
//shader code
gl.glUseProgram(shader.p);
gl.glDrawRangeElements(GL2.GL_TRIANGLE_STRIP, 0, 2, 3, GL2.GL_UNSIGNED_INT, 0); //start render at 0 verts go to 3 for a count of 4
gl.glUseProgram(0);
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL3 gl = drawable.getGL().getGL3();
GLU glu = new GLU();
gl.glViewport(0, 0, width, height);
glu.gluPerspective(45.0f, (float) width / (float) height, 0.1f, 100.0f);
}
}
}
and this goes in shaderprogram
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GL3;
import javax.media.opengl.GLAutoDrawable;
public class ShaderProgram {
public ShaderProgram(GLAutoDrawable drawable, File vertf, File fragf) {
this.vertf = vertf;
this.fragf = fragf;
GL3 gl = drawable.getGL().getGL3();
int p = gl.glCreateProgram();
//VERTEX STUFF
int v = gl.glCreateShader(gl.GL_VERTEX_SHADER);
ArrayList <String> vSourceA = new ArrayList<String>();
Scanner vert = null;
try {
vert = new Scanner(vertf);
} catch (FileNotFoundException e) {
System.out.println("Vertex shader file was not found");
}
vert.useDelimiter("\n");
while(vert.hasNext()){
String temp = vert.next() + "\n";
vSourceA.add(temp);
System.out.print(temp);
}
String[] vSource = new String[vSourceA.size()];
vSource = vSourceA.toArray(vSource);
int [] lengths= new int[vSource.length];
for(int i = 0; i < vSource.length; i++){
lengths[i] = vSource[i].length();
}
gl.glShaderSource(v, lengths.length, vSource, lengths, 0);
gl.glCompileShader(v);
gl.glAttachShader(p, v);
//FRAGMENT SHADER CODE
int f = gl.glCreateShader(gl.GL_FRAGMENT_SHADER);
ArrayList <String> fSourceA = new ArrayList<String>();
Scanner frag = null;
try {
frag = new Scanner(fragf);
} catch (FileNotFoundException e) {
System.out.println("Fragment shader file was not found");
}
frag.useDelimiter("\n");
while(frag.hasNext()){
String temp = frag.next() + "\n";
fSourceA.add(temp);
System.out.print(temp);
}
String[] fSource = new String[fSourceA.size()];
fSource = fSourceA.toArray(fSource);
lengths= new int[fSource.length];
for(int i = 0; i < fSource.length; i++){
lengths[i] = fSource[i].length();
}
gl.glShaderSource(f, lengths.length, fSource, lengths, 0);
gl.glCompileShader(f);
gl.glAttachShader(p, f);
//PROGRAM CODE
gl.glLinkProgram(p);
gl.glValidateProgram(p);
System.out.println(gl.glGetError());
valid = true;
}
int p;
boolean valid = false;
File vertf;
File fragf;
}
frag.txt
#version 150
out vec4 fragmentColor;
void
main()
{
fragmentColor = vec4(0.0, 1.0, 0.0, 1.0);
}
";
vert.txt
#version 150
in vec3 vertex;
void
main()
{
gl_Position = vec4(vertex,1.0);
}
";