Login  Register

May someone help me to find out why this code doesn't work?

Posted by Peter Dinklemore on Apr 29, 2017; 1:46pm
URL: https://forum.jogamp.org/May-someone-help-me-to-find-out-why-this-code-doesn-t-work-tp4037915.html

I'm quite new to JOGL and though I have built some smaller applications with it I can't get my code to work when using OpenGL 4.

The two tutorials I'm following mainly are https://learnopengl.com/#!Getting-started/Hello-Triangle and http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/.

HelloOpenGL.java:
import java.awt.Dimension;

import javax.swing.JFrame;

import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLJPanel;
import com.jogamp.opengl.util.FPSAnimator;

public final class HelloOpenGL {
	public static final void main(final String[] args) {
		final JFrame frame = new JFrame("Hello, OpenGL!");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);

		final GLProfile glProfile = GLProfile.get(GLProfile.GL4);
		final GLCapabilities glCapabilities = new GLCapabilities(glProfile);
		final GLJPanel glJPanel = new GLJPanel(glCapabilities);
		glJPanel.setPreferredSize(new Dimension(960, 640));
		final EventListener eventListener = new EventListener();
		glJPanel.addGLEventListener(eventListener);
		frame.add(glJPanel);

		frame.setVisible(true);
		frame.pack();
		frame.setLocationRelativeTo(null);

		final FPSAnimator fpsAnimator = new FPSAnimator(glJPanel, 60);
		fpsAnimator.start();
	}

	private HelloOpenGL() {
	}
}

EventListener.java:
import static com.jogamp.opengl.GL.GL_ARRAY_BUFFER;
import static com.jogamp.opengl.GL.GL_FLOAT;
import static com.jogamp.opengl.GL.GL_STATIC_DRAW;
import static com.jogamp.opengl.GL.GL_TRIANGLES;
import static com.jogamp.opengl.GL2ES2.GL_FRAGMENT_SHADER;
import static com.jogamp.opengl.GL2ES2.GL_VERTEX_SHADER;

import java.nio.FloatBuffer;

import com.jogamp.opengl.GL4;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.util.glsl.ShaderCode;
import com.jogamp.opengl.util.glsl.ShaderProgram;

public final class EventListener implements GLEventListener {
	private static final int VERTEX_ATTRIB_POSITION = 0;

	private final FloatBuffer vertices;

	private int VBO;
	private int VAO;
	private int shaderProgram;

	public EventListener() {
		this.vertices = FloatBuffer.wrap(new float[] { 0, 0, 0, 1, 0, 0, .5f, 1, 0 });
	}

	@Override
	public final void init(final GLAutoDrawable glAutoDrawable) {
		final GL4 gl4 = glAutoDrawable.getGL().getGL4();

		this.initBuffers(gl4);
		this.initVertexArrays(gl4);
		this.initShaderProgram(gl4);
	}

	private final void initBuffers(final GL4 gl4) {
		final int[] buffers = new int[1];
		gl4.glGenBuffers(buffers.length, buffers, 0);
		this.VBO = buffers[0];
	}

	private final void initVertexArrays(final GL4 gl4) {
		final int[] vertexArrays = new int[1];
		gl4.glGenVertexArrays(vertexArrays.length, vertexArrays, 0);
		this.VAO = vertexArrays[0];

		gl4.glBindVertexArray(this.VAO);
		{
			gl4.glBindBuffer(GL_ARRAY_BUFFER, this.VBO);
			gl4.glBufferData(GL_ARRAY_BUFFER, this.vertices.capacity(), this.vertices, GL_STATIC_DRAW);

			gl4.glVertexAttribPointer(EventListener.VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, false, 3 * Float.BYTES, 0);
			gl4.glEnableVertexAttribArray(EventListener.VERTEX_ATTRIB_POSITION);
		}
		gl4.glBindVertexArray(0);
	}

	private final void initShaderProgram(final GL4 gl4) {
		final ShaderProgram shaderProgram = new ShaderProgram();
		final ShaderCode vertexShader = ShaderCode.create(gl4, GL_VERTEX_SHADER, EventListener.class, "", null,
				"shader", "vert", null, true);
		shaderProgram.add(vertexShader);
		final ShaderCode fragmentShader = ShaderCode.create(gl4, GL_FRAGMENT_SHADER, EventListener.class, "", null,
				"shader", "frag", null, true);
		shaderProgram.add(fragmentShader);
		shaderProgram.init(gl4);
		shaderProgram.link(gl4, System.err);
		// vertexShader.destroy(gl4);
		// fragmentShader.destroy(gl4);
		this.shaderProgram = shaderProgram.program();
	}

	@Override
	public final void reshape(final GLAutoDrawable glAutoDrawable, final int x, final int y, final int width,
			final int height) {
		final GL4 gl4 = glAutoDrawable.getGL().getGL4();
		gl4.glViewport(0, 0, width, height);
	}

	@Override
	public final void display(final GLAutoDrawable glAutoDrawable) {
		final GL4 gl4 = glAutoDrawable.getGL().getGL4();

		gl4.glUseProgram(this.shaderProgram);

		gl4.glBindVertexArray(this.VAO);
		gl4.glDrawArrays(GL_TRIANGLES, 0, 40);
		gl4.glBindVertexArray(0);
	}

	@Override
	public final void dispose(final GLAutoDrawable glAutoDrawable) {
	}
}

shader.vert:
#version 450 core

in layout(location = 0) vec3 position;

void main() {
	gl_Position = vec4(position, 1);
}

shader.frag
#version 450 core

out vec4 color;

void main() {
	color = vec4(1, 0, 0, 1);
}

Thanks in advance