JOGL-Code != C OpenGL-Code?

Network

Top Contributor
Hallo

- Ich versuche in OpenGL 4.X für Java Einzug zu finden. Was anscheinend nur mit JOGL funktioniert, jedenfalls habe ich nichts anderes gefunden gehabt.
Tipp am Rande: Nicht JOGL verwenden wenn möglich.

Da ich keine OpenGL 4 JOGL Tutorials finde - habe ich mich an ein C++ Tutorial geheftet und so gut wie möglich versucht den Code in Java zu übersetzen.

- Kurz und gut: Der Code funktioniert nicht.
- Frage: Darf ich mich dabei an solche Tutorials wenden? Oder sind das Welten zwischen JOGL und dem echten OpenGL?


- Nebenbei hier ein kleines compilierbares Beispiel meines Codes (1zu1 übersetzt aus diesem Tutorial)
Vieleicht hat ja jemand mal Lust sich das anzuschauen.
Der Code wurde mit zusätzlichem Code ergänzt im Konstruktor der Main-Klasse (So beschrieben auf der offiziellen JOGL-Website)
Java:
public class Main implements GLEventListener {
	private int triangleID;

	public Main() {
		JFrame jFrame = new JFrame();

		// Init
		GLProfile glp = GLProfile.getDefault(); // Result: GL4bc
		GLProfile.initSingleton();
		GLCapabilities glcaps = new GLCapabilities(glp);
		GLCanvas glc = new GLCanvas(glcaps);

		jFrame.add(glc);

		glc.addGLEventListener(this);

		FPSAnimator animator = new FPSAnimator(glc, 60);
		animator.add(glc);
		animator.start();

		// End
		jFrame.setTitle("JOGL");
		jFrame.setSize(500, 500);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setVisible(true);
		jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
	}

	public static void main(String[] args) {
		new Main();
	}

	@Override
	public void init(GLAutoDrawable drawable) {
		System.out.println("Init");

		GL4 gl = drawable.getGL().getGL4();

		// VAO
		int vertexArrayID[] = new int[1];
		gl.glGenVertexArrays(1, vertexArrayID, 0);
		gl.glBindVertexArray(vertexArrayID[0]);

		// Init Triangle
		float triangle[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
				0.0f };
		FloatBuffer fb = FloatBuffer.allocate(triangle.length);
		fb.position(0);
		fb.put(triangle);
		fb.position(0);

		int array[] = new int[1];
		gl.glGenBuffers(1, array, 0);
		triangleID = array[0];
		gl.glBindBuffer(GL4.GL_ARRAY_BUFFER, triangleID);
		gl.glBufferData(GL4.GL_ARRAY_BUFFER, fb.capacity(), fb,
				GL4.GL_STATIC_DRAW);
	}

	@Override
	public void dispose(GLAutoDrawable drawable) {
	}

	@Override
	public void display(GLAutoDrawable drawable) {
		System.out.println("Display");

		GL4 gl = drawable.getGL().getGL4();

		gl.glEnableVertexAttribArray(0);
		gl.glBindBuffer(GL4.GL_ARRAY_BUFFER, triangleID);
		gl.glVertexAttribPointer(0, 3, GL4.GL_FLOAT, false, 0, 0);
		gl.glDrawArrays(GL4.GL_TRIANGLES, 0, 3);
		gl.glDisableVertexAttribArray(0);
	}

	@Override
	public void reshape(GLAutoDrawable drawable, int x, int y, int width,
			int height) {
	}
}
 

Kr0e

Gesperrter Benutzer
Also zuerst mal:

Ich meine LWJGL kann auch OpenGL 4 aufwärts. Frag mich nicht wie, aber die Sachen waren damals immer in so GL15, GL20, GL33 etc gegliedert, ist bei mir schon ne Weile her.

Am Code fällt mir grad spontan nichts ein und hab grad auch kein Java etc. isntalliert ums zu testen.

Erste Idee: Du übergibts FloatBuffer. Musste man da nicht iwie rewind() oder flip() aufrufen ? Oder lesen die gl Funktionen den gesamten Buffer aus?

Davon abgesehen, WAS klappt denn nicht ?



[OT]
Ich persönlich würde für OpenGL C/C++ empfehlen, einfach weil es näher am API ist (nein! Ich rede nicht von Geschwindigkeit). Ich habe mich bei Java oft über diese ganzen Buffer etc. geärgert. Das API ist für eine Zeiger-orientierte Sprache gemacht. Allein schon dass man Wrapper braucht, die gewartet und weiterentwickelt werden müssen finde ich unbefriedigend. C++ & Qt ist der Bringer für OpenGL ;)
[/OT]
 

Marco13

Top Contributor
gl.glBufferData(GL4.GL_ARRAY_BUFFER, fb.capacity()*4, fb, GL4.GL_STATIC_DRAW);

Das sind bytes - was auch siezof im originalcode liefert.
 

Network

Top Contributor
"Tipp am Rande: Nicht JOGL verwenden wenn möglich."
Nicht falsch verstehen, ich verwende JOGL weil ich es im Moment für eine sehr gute Schnittstelle halte - die fehlende Dokumentation des Codes kann einen aber wahnsinnig machen als Umsteiger auf 3 und höher.

Also zuerst mal:

Ich meine LWJGL kann auch OpenGL 4 aufwärts. Frag mich nicht wie, aber die Sachen waren damals immer in so GL15, GL20, GL33 etc gegliedert, ist bei mir schon ne Weile her.

[...]

Davon abgesehen, WAS klappt denn nicht ?

Ja LWJGL hatte ich früher für <3.0 verwendet, wusste nicht, dass es auch höher geht. (Habe aber auch nie die Libs aktualisiert).
Es "wurde" kein Dreieck angezeigt.

[OT]
Ich persönlich würde für OpenGL C/C++ empfehlen, einfach weil es näher am API ist (nein! Ich rede nicht von Geschwindigkeit). Ich habe mich bei Java oft über diese ganzen Buffer etc. geärgert. Das API ist für eine Zeiger-orientierte Sprache gemacht. Allein schon dass man Wrapper braucht, die gewartet und weiterentwickelt werden müssen finde ich unbefriedigend. C++ & Qt ist der Bringer für OpenGL ;)
[/OT]

Definitiv. Man bemerkt die leichte Unverträglichkeit von Java und OpenGL.
Im Moment bringe ich mir zum zweiten mal OpenGL und allgemein Hardware3DComputergrafik bei, auf Rat von Marco13 (Ja zufällig die andere Person die hier geantwortet hat) bei - da zwischen 2 und 3 ja ein extremer Sprung liegt.
Und genau was du beschreibst stört mich auch jedesmal wieder beim studieren der Texte.

Jedoch wird aus einer platformunabhängigen Schnittstelle und einer platformabhängigen Sprache ein platformabhängiges Programm. ;) (Wer darauf aber kein Wert legt sondern auf OpenGL selbst...)

gl.glBufferData(GL4.GL_ARRAY_BUFFER, fb.capacity()*4, fb, GL4.GL_STATIC_DRAW);

Das sind bytes - was auch siezof im originalcode liefert.

Natürlich! Vielen Dank - Den Wald vor lauter Bäumen nicht gesehen! Und mit so einem Problem habe ich das Forum behelligt.
Jetzt kann ich auf jedenfall mit gutem Gewissen von der Kompatiblität zwischen C++ und Java ausgehen.


Mit freundlichen Grüßen,
Net
 
G

Guest2

Gast
Moin,

streng genommen ist glVertexAttribPointer außerdem ausschließlich für die Verwendung mit Shadern spezifiziert. Das es manchmal auch mit der Fixed Function Pipline geht ist mehr Zufall als zu erwartendes Verhalten (oder Toleranz der Treiberentwickler ;)).

Viele Grüße,
Fancy
 

Marco13

Top Contributor
Der eigentliche Fehler war ja eher ein "Tipp"fehler. Genausogut hätte man in C statt
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), ... );
"versehentlich"
glBufferData(GL_ARRAY_BUFFER, numberOfVertices, ... );
schreiben können.

BTW, @Fancy: Ja, ich hatte schon eine Antwort geschrieben: ~"Ich bin nicht sicher, ob ohne Shader überhaupt was angezeigt werden KANN". Aber dann wollte ich nichts falsches schreiben (auch weil das ja so im Tutorial stand - das muss nicht viel aussagen, aber trotzdem). EDIT> Aber gibt's nicht sogar eine Regel, dass die Vertices immer Attribute Location 0 haben müssen? Kann mich täuschen, bin nicht ganz auf dem neuesten Stand <EDIT

Deswegen habe ich ca. 1 Stunde rumprobiert, Shader eingefügt, die Initialisierung stückweise an ein Beispiel angepasst, bei dem ich wußte, dass es funktioniert, aber es wollte um's verrecken das Dreieck nicht anzeigen - bis ich den Bleistift auf die Tastatur geworfen habe, und er Zufällig auf den Tasten [c]*4[/c] landete.

Das zeigt aber IMHO das eigentliche Problem: Es geht nicht um OpenGL oder JOGL, sondern darum, dass OpenGL SEHR low-level ist (und darum prinzipbedingt schwer zu verwenden und viele Fehlerquellen hat), aber vielleicht noch viel mehr darum, dass es kaum Fehlermeldungen oder Debugmöglichkeiten gibt: Wenn was nicht stimmt, zeigt er nichts an. Viel Spaß beim Suchen.

Genaugenommen ist JOGL da sogar noch etwas "gutmütiger", weil man immerhin ein
GL4 gl = new DebugGL4(drawable.getGL().getGL4());
erstellen kann, und zumindest die "offensichtlichen" Fehler (die man in C durch Abfragen von glGetError nach JEDER Zeile :autsch: checken müßte) mit einer Exception quittiert bekommt.
 

Evil-Devil

Top Contributor
LWJGL 2.8.5 unterstützt aktuell OGL 4.3 und OGL ES 3.0

Solange man keine explizite Version beim erzeugen des Displays angibt wird meine ich ein OGL Context im Kompatibilitätsmodus erzeugt. Für OGL 3.0 und aufwärts muss man lediglich beim erzeugen die Major und Minor Version mit übergeben. Dazu sollte es im Wiki eigentlich ein Beispiel geben.
 
G

Guest2

Gast
BTW, @Fancy: Ja, ich hatte schon eine Antwort geschrieben: ~"Ich bin nicht sicher, ob ohne Shader überhaupt was angezeigt werden KANN". Aber dann wollte ich nichts falsches schreiben (auch weil das ja so im Tutorial stand - das muss nicht viel aussagen, aber trotzdem). EDIT> Aber gibt's nicht sogar eine Regel, dass die Vertices immer Attribute Location 0 haben müssen? Kann mich täuschen, bin nicht ganz auf dem neuesten Stand <EDIT

Imho steht in der aktuellen Spec nichts, was die Location 0 von den anderen unterscheidet (außer das es eben die Erste ist). Im OpenGL Wiki stand / steht (?) das man aus Kompatibilitätsgründen die Positionen in Location 0 ablegen sollte. Allerdings finde ich den entsprechenden Abschnitt dort auch nicht mehr.

Wenn ein OpenGL Core Profil verwendet wird, ist es eh einfach: Kein Shader -> kein Bild.

Im Compatibility Profile wird das dann imho schwammig. Ich würde mich nicht drauf verlassen, dass es überall geht. ;)


Das zeigt aber IMHO das eigentliche Problem: Es geht nicht um OpenGL oder JOGL, sondern darum, dass OpenGL SEHR low-level ist (und darum prinzipbedingt schwer zu verwenden und viele Fehlerquellen hat), aber vielleicht noch viel mehr darum, dass es kaum Fehlermeldungen oder Debugmöglichkeiten gibt: Wenn was nicht stimmt, zeigt er nichts an. Viel Spaß beim Suchen.

Das schärft den Blick für Details. ;)

Viele Grüße,
Fancy
 

Network

Top Contributor
Ich werde auf die zusätzlichen jedoch sehr interessanten Kommentare nicht eingehen, habe es aber gelesen und das "zusätzliche Wissen" anwenden. : )

Nebenbei hat sich LWJGL doch sehr zum positiven entwickelt. Es hat immernoch schwächen insbesondere da die höheren GL-Versionen nicht von den niedrigeren erben (Jedesmal die unvollständige OpenGL-Doc durchsuchen nach der richtigen Version) scheint aber sehr schön gepflegt zu werden.
Ich freu mich schon wie ein kleines Kind auf die ShaderProgrammierung - Wenn man sich die Beispiele der NVIDIA Corporation dazu anschaut wird es warm ums Programmiererherz.

Gruß
Net
 

Marco13

Top Contributor
[TIPP]Auf meinem Desktop liegt eine Datei namens "lwjgl imports.txt" mit diesem Inhalt:[/TIPP]
Code:
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL21.*;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL31.*;
import static org.lwjgl.opengl.GL32.*;
import static org.lwjgl.opengl.GL33.*;
import static org.lwjgl.opengl.GL40.*;
:D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S Jogl und JavaFX AWT, Swing, JavaFX & SWT 6
K Jogl tutorial gesucht AWT, Swing, JavaFX & SWT 2
H JOGL Programmierung - glRotatef() AWT, Swing, JavaFX & SWT 4
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
E 3D-Grafik JOGL (lädt sehr lange) AWT, Swing, JavaFX & SWT 20
M 2D-Grafik Performante Scatterplots mit J2d oder jOGL AWT, Swing, JavaFX & SWT 3
D 3D-Grafik Jogl download AWT, Swing, JavaFX & SWT 7
-horn- WorldWindJava+JOGL soll einen animierten Graphen anzeigen, wie? AWT, Swing, JavaFX & SWT 4
M java2D/jogl interoperability AWT, Swing, JavaFX & SWT 22
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
T Jogl? AWT, Swing, JavaFX & SWT 2
comp_math Code snippets AWT, Swing, JavaFX & SWT 3
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Kann man den Code umschreiben? AWT, Swing, JavaFX & SWT 8
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ActionEvent Press Enter per Code auslösen AWT, Swing, JavaFX & SWT 22
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
S JavaFX JavaScript Code in WebView/WebEngine AWT, Swing, JavaFX & SWT 0
L JavaFX GUI mit JavaFX. Scene Builder source code? AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
T Tab per Code wechseln? AWT, Swing, JavaFX & SWT 3
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
R Source-Code, Javadoc AWT, Swing, JavaFX & SWT 16
S NetBeans GUI Builder - Code-Platzierung AWT, Swing, JavaFX & SWT 3
J Sauberer Gui-Code? AWT, Swing, JavaFX & SWT 22
B Color String Code AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
A Applet Applet aus Code neu starten AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Warum funktioniert dieser Code ? (GUI) AWT, Swing, JavaFX & SWT 9
M ActionListener mit code!!! auslösen AWT, Swing, JavaFX & SWT 3
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
K Swing GUI code tutorials? AWT, Swing, JavaFX & SWT 5
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
G Code Blöcke AWT, Swing, JavaFX & SWT 6
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
O Source Code für "javax.swing.JLabel" ? AWT, Swing, JavaFX & SWT 2
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
R Sun tutorial code von jcombobox mit image im combobox fehlt! AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
M Code umbauen ? AWT, Swing, JavaFX & SWT 7
C GUI passt sich nicht dem Code an! AWT, Swing, JavaFX & SWT 4
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2
B Code Architektur verbessern. AWT, Swing, JavaFX & SWT 4
R Syntax Highlighting von Java-Code AWT, Swing, JavaFX & SWT 2
O Swing Event / in GUI oder im Code ausgelöst ? AWT, Swing, JavaFX & SWT 2
J eventhandling / Problemmeldung Bitte schaut euch den Code an AWT, Swing, JavaFX & SWT 2
M Code Schloss AWT, Swing, JavaFX & SWT 11
C wysiwyg Editor zum Einbinden in meinem Code AWT, Swing, JavaFX & SWT 14
m@nu JComboBox & ItemListener: per Code 1. Item wählen AWT, Swing, JavaFX & SWT 2
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
H Code nach dem schließen eines Fensters ausführen? AWT, Swing, JavaFX & SWT 3
M Was halter iht von diesem Code? AWT, Swing, JavaFX & SWT 7
O 3D-Grafik OpenGL CubeMaps - Skybox Rendering AWT, Swing, JavaFX & SWT 0
X 3D-Grafik [OpenGL] First Person Camera AWT, Swing, JavaFX & SWT 2
E 3D-Grafik LWJGl OpenGL Version vor Erstellung des Displays abfragen AWT, Swing, JavaFX & SWT 2
B OpenGl lwjgl Verständnisproblem AWT, Swing, JavaFX & SWT 5
D OpenGL ansprechen AWT, Swing, JavaFX & SWT 2
N 3D-Grafik OpenGL FPS Einbruch AWT, Swing, JavaFX & SWT 18
N 3D-Grafik OpenGL Texturindexe AWT, Swing, JavaFX & SWT 4
K OpenGL koordinatensystem AWT, Swing, JavaFX & SWT 7
F AWT Component in OpenGL anzeigen? AWT, Swing, JavaFX & SWT 18
ChillSn Geteiltes Fenster in Bedienoberfläche und OpenGL-Ausgabebereich AWT, Swing, JavaFX & SWT 11
S swing + openGL in c++? AWT, Swing, JavaFX & SWT 8
M Swing und OpenGL AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben