JOGL Texturing

Status
Nicht offen für weitere Antworten.
http://too-late.de/kskb/gl2sample1.zip

Wie gehabt, nicht entpacken, sondern saugen und dann:
Eclipse -> File -> Import -> General -> Existing Projects into Workspace -> Select archive file -> Browse -> gl2sample1.zip auswählen -> Öffnen -> Finish

Für Erklärungen siehe z.B. Tutorial Lektion 4 ? DGL Wiki
(ist für Delphi, spielt aber keine Rolle da in gl2sample1.zip funktionierender Code ist)
(oder eben z.B. jogl.info / am besten beides lesen 😉)

(Es gibt bei den JOGL Utils auch noch TextureIO und TextureCoords, wenn Dich das interessiert, siehe z.B. demos.texture.TestTexture. Ich nutze aber die util Klassen (fast) nie sondern gehe immer den klassischen Weg wie oben im Beispiel.)

Gruß,
Fancy
 
Es deutet sich an, dass es ähnlich wie bei Java3D laufen wird... Oder noch schlimmer... 🙁 @Fancy: Dir wünsche ich noch viel Durchhaltevermögen... wenn es so weitergeht, postest du hier denmächst einen 3D-Shooter, den zwar DU geschrieben hast, wo aber im Abspann ein anderer Name steht 😉
 
Noch was zum Lightning.
Ích hab in nem tutorial gelesen, dass man das so macht:
Java:
        // Prepare light parameters.
        float SHINE_ALL_DIRECTIONS = 1;
        float[] lightPos = {-30, 0, 0, SHINE_ALL_DIRECTIONS};
        float[] lightColorAmbient = {0.2f, 0.2f, 0.2f, 1f};
        float[] lightColorSpecular = {0.8f, 0.8f, 0.8f, 1f};

        // Set light parameters.
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, lightPos, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, lightColorAmbient, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, lightColorSpecular, 0);

        // Enable lighting in GL.
        gl.glEnable(GL.GL_LIGHT1);
        gl.glEnable(GL.GL_LIGHTING);

        // Set material properties.
        float[] rgba = {0.3f, 0.5f, 1f};
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, rgba, 0);
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, rgba, 0);
        gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, 0.5f);
bevor man ein Object zeichnet.

Aber:
Die ganze final ints, also GL_AMBIENT, GL_SPECULAR, usw.. gibt es bei mir in Eclipse nciht.

Ich habe es gemacht, wie mir fancy geraten hat, das ganze in eclipse, von diesem zip reinzupacken, ich hab alles von jogl, doch diese variablen gibt es bei mir nicht, was soll ich machen.

Kann mir einer von euch einen kurzen code posten, wie man lightning macht?
 
GL_AMBIENT liegt jetzt z.B. in GL2.GL_AMBIENT (genau genommen in GLLightingFunc, aber das ist nicht so dramatisch).
Mit den anderen verhält es sich analog.

@Marco: Danke, ich glaube Durchhaltevermögen werde ich auch brauchen, aber en Shooter werd ich Ihm nicht bauen 😉

Gruß,
Fancy
 
GL_AMBIENT liegt jetzt z.B. in GL2.GL_AMBIENT (genau genommen in GLLightingFunc, aber das ist nicht so dramatisch).
Mit den anderen verhält es sich analog.

@Marco: Danke, ich glaube Durchhaltevermögen werde ich auch brauchen, aber en Shooter werd ich Ihm nicht bauen 😉

Gruß,
Fancy

Hey man, jetzt funktioniert das ja alles.
Danke man!
Danke!

Noch was, in dem tutorial das ich habe momentan erstma als einstieg, und ja ich kann english,
JOGL (Java OpenGL) Tutorial
hieß es mit dem texturing:
Java:
	    // Load earth texture.
        try 
        {
            InputStream stream = getClass().getResourceAsStream("earth.jpg");
            TextureData data = TextureIO.newTextureData(stream, false, "jpg");
            earthTexture = TextureIO.newTexture(data);
        }
        catch (Exception exc) 
        {
        	exc.printStackTrace();
        }
in der init methode würde mir eine textur laden,
aber irgendwie funktioniert das bei mir nicht, weil er den Stream nicht öffnet, da steht dann immer Stream = null.
Fehlermeldung:
Code:
java.io.IOException: Stream was null
	at com.sun.opengl.util.texture.TextureIO.newTextureDataImpl(TextureIO.java:784)
	at com.sun.opengl.util.texture.TextureIO.newTextureData(TextureIO.java:205)
	at Samples.Sample0.init(Sample0.java:32)
	at com.sun.opengl.impl.GLDrawableHelper.init(GLDrawableHelper.java:88)
	at javax.media.opengl.awt.GLCanvas$InitAction.run(GLCanvas.java:603)
	at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:149)
	at javax.media.opengl.awt.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:637)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Was mache ich falsch, die datei gibt es ja, earth.jpg


Und danke für alle Tipps die du mir gibt Fancy.
Wirklich.

Developer_X
 
Was mache ich falsch, die datei gibt es ja, earth.jpg

Das mag sein, aber wohl nicht da wo die JVM danach sucht.

Mach mal ein

Code:
InputStream stream = getClass().getResourceAsStream("earth.jpg");
System.out.println(stream);

Und das ausgegebene null wird Dir sagen das die Datei nicht an der richtigen Stelle ist.

Siehe noch mal in das gl2sample1:

Code:
private static final String imagePath = "late/resources/jogl2/gl2/image.png";
[..]
getClass().getClassLoader().getResourceAsStream(imagePath)

und sieh Dir an wo das image.png im Project liegt. Ist alles nur eine Frage der richtigen Pfade.

Gruß,
Fancy
 
Das mag sein, aber wohl nicht da wo die JVM danach sucht.

Mach mal ein

Code:
InputStream stream = getClass().getResourceAsStream("earth.jpg");
System.out.println(stream);

Und das ausgegebene null wird Dir sagen das die Datei nicht an der richtigen Stelle ist.

Siehe noch mal in das gl2sample1:

Code:
private static final String imagePath = "late/resources/jogl2/gl2/image.png";
[..]
getClass().getClassLoader().getResourceAsStream(imagePath)

und sieh Dir an wo das image.png im Project liegt. Ist alles nur eine Frage der richtigen Pfade.

Gruß,
Fancy

wie viele gibt es eig.?
http://too-late.de/kskb/gl2sample0.zip
http://too-late.de/kskb/gl2sample1.zip

und?
 
Hey, mit dem chema, wie es in dem zip beschrieben ist, hab ich das ganze mal versucht auf einen sphere zu übertragen.

Java:
        GLUquadric earth = glu.gluNewQuadric();
        glu.gluQuadricTexture(earth, true);

        glu.gluQuadricDrawStyle(earth, GLU.GLU_FILL);
		glu.gluQuadricTexture(earth, true);

        glu.gluQuadricNormals(earth, GLU.GLU_FLAT);
        glu.gluQuadricOrientation(earth, GLU.GLU_OUTSIDE);
        final float radius = 1f;
        final int slices = 20;
        final int stacks = 20;
        glu.gluSphere(earth, radius, slices, stacks);
        glu.gluDeleteQuadric(earth);

Das sieht dann aber leider so aus:
Warum?
Warum wird außerdem die normale textur so umgeändert?

Welche Objekte kann man eig. zeichnen mit jogl?
Wie kann man eig. das HUD Zeichnen? (Foreground&&Background)
Bitte beantworte diese fragen, danke, DEveloper_X
 

Auch wenn Du Deine Kugel als gluSphere zeichnest, so besteht diese trotzdem aus etlichen Dreiecken. Diese Dreiecke werden nicht sortiert von hinten nach vorne gezeichnet, sondern zufällig. Dabei kann es passieren das einzelne Dreiecke die aktuell eigentlich hinten an der Kugel liegen, spät gezeichnet werden und dabei Dreiecke der Vorderseite fälschlicherweise verdecken. Um dies zu verhindern gibt es in OpenGL einen Depth Buffer der für jeden Pixel die aktuelle Tiefeninformation speichert und so für jeden Pixel eines Dreiecks entscheiden kann ob dieses vor oder hinter dem bereits gezeichneten Pixel liegt. Diesen Tiefentest musst Du aktivieren (in der init()) mit:

Code:
gl.glEnable(GL.GL_DEPTH_TEST);


Warum wird außerdem die normale textur so umgeändert?

Die Farben sind vertauscht weil der Rot und Blau Kanal vertauscht sind. Ersetze in der init() das glTexImage2D mit

Code:
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, imageWidth, imageHeight, 0, GL2.GL_BGR, GL.GL_UNSIGNED_BYTE, imagePixels);


Welche Objekte kann man eig. zeichnen mit jogl?

Vor allem Dreiecke, es gehen aber auch Polygone, Linien und Punkte. In den GLU und GLUT Klassen gibt es außerdem einige geometrische Körper insbesondere den bekannten glutSolidTeapot().

Aber, praktisch jedes OpenGL Programm zeichnet entweder den glutSolidTeapot (wenn es aktuell nicht auf die Geometrie ankommt) oder ausschließlich Dreiecke!

Der normale Weg ist:
1. Du modellierst Deine 3D Objekte in einem 3D Model Programm (z.B. Blender)
2. Du exportierst Dein Objekt als Dreiecksgitternetz (z.B. als obj File)
3. Du liest Dein obj File mit Java ein
4. Du überträgst Dein 3D Gitternetz in den Speicher der Grafikkarte
5. Du läst Dein Gitternetz darstellen

(Das ist vollkommen analog zu Texturen: Zeichnen (mit Photoshop / Gimp), exportieren (als JPG / PNG), einlesen in JAVA (ImageIO), in den Speicher der Grafikkarte schieben (glTexImage2D), darstellen (glBindTexture). Nur ist bei der Geometrie "etwas" mehr zu implementieren 😉)


Wie kann man eig. das HUD Zeichnen? (Foreground&&Background)

1. Szene zeichnen
2. Depth Test ausschalten
3. Projektionsmatrix auf 2D orthogonal umstellen
4. HUD zeichnen (liegt dann automatisch im Vordergrund)

Gruß,
Fancy
 
danke für alle deine hilfen.
Du musst verstehen, Java3D hat ja ein ganz anderes Konzept als JOGL, also meines Erachtens, und da ich neu in JOGL bin, habe ich noch viel zu lernen, danke dass du mich so unterstützt.
Wirklich danke.
 
Da JOGL bekanntlich primär ein OpenGL Binding ist und nicht wie Java3D ein kompletter Szenegraph empfiehlt es sich entsprechende OpenGL Lektüre zu lesen. Ein Anfang hierfür kann u.a. das OpenGL RedBook sein: OpenGL Programming Guide : Table of Contents

Überhaupt sitzt man mit JOGL und Co relativ nah an der Hardware und muss für vieles selbst die Funktionalität erstellen. Alternativ kann man auf bestehende Libs zurückgreifen die einem die Arbeit annehmen.
 
Wichtige Grundlagen stehen im Redbook - das ist klar. Allerdings sind die Unterschiede von OpenGL >1 zu dem, was im Redbook steh, inzwischen so groß, dass man das mit etwas Vorsicht genießen sollte...
 
Das ist klar, aber willst du ihm gleich Shader und derlei zumuten? Dann gibt es hier nur noch Tränen zu vergießen. Er sollte zunächst die Grundlagen erlernen um ein Verständnis für die Materie zu erhalten. Denn sonst nützen ihm Shader und Co. mMn herzlich wenig.
 
Natürlich, wie gesagt, die Grundlagen stehen dort drin, und das ist auch OK, aber ... ... ... aus der Erfahrung heraus ... 🙁 ... OK, gut, den Thread "Hilfe, er unterstreicht glBegin, obwohl das doch genau so im Buch steht" beantwortest DU :bae: 😉
 
OK, gut, den Thread "Hilfe, er unterstreicht glBegin, obwohl das doch genau so im Buch steht" beantwortest DU :bae: 😉
.. vielleicht sollte man noch tiefer anfangen...bei "Wie nutze ich meine Eclipse IDE!?" oder "Wie lese und verstehe ich eine Readme Datei?!" ...

Naja, erstmal muss er sich überhaupt bis glBegin vorkämpfen und es von selbst nutzen ohne es aus einem Tut abzuschreiben.
 
War die ganze zeit net on, wollt jetzt aber noch was fragen.
Wie kann ich "Texture"s laden?

Ich möchte nämlich 2 objekte, mit 2 verschiedenen Texturen "versehen".
Und in der Klasse Textur gibt es zahlreiche Methoden, z.B.
für binden von Texturen:
texture.bind();

versteht ihr?
Dass ich wenn ich das erste Objekt zeichne erst einmal, die textur "bind"e, die für das erste objekt sein soll, danach zeichne ich das erste objekt, und danach das ganze noch einmal für das zweite objekt.

Versteht ihr?

Ich will wissen wie man Texturen ladet.
Fancy, kannst du mir dabei helfen, pls.`?
 
Hätte hier noch ein kleines Tutorial wie man TGAs in LWJGL lädt. Das sollte sich relativ einfach nach JOGL portieren lassen.
lwjgl:tutorials:textures:tga [LWJGL Wiki]
Für JPGs musst du dann was anderes nehmen.

Ansonsten musst du nachdem du eine Textur geladen hast sie wirklich erst binden, dann zeichnen und dann die nächste Textur binden und wieder zeichnen lassen.
 
ich hab mir das mal ein bisschen angeschaut.
Das ist aber auch mit einer Library geschrieben,
die ich nicht habe. Ich habe doch nur das ganz normale JOGL.
Geht das nciht einfacher`?
Dass man einfach die daten aus einem bild ladet, und sie der textur zuweist.
Es gibt doch bestmmt einen ganz einfachen weg.
Wie lautet der noch gleich`?
 
Äehhm... Ich fang' grad' mit Java3D an und wollte mal fragen wie das so geht mit diesen performanten 3D-Welten (Ladscapes)...
...Ja nee... Ist natürlich völliger Blödsinn... Ist ja kein Geheimnis, das ich mit Java3D bereits durch bin.
Aber so kommt mir gerade dieses Jungesellen-Vorgehen unseres Developer_X vor. Immer ganz Hinten anfangen... dann ist man eher Fertig.:lol:
@Developer_X: Mal im Ernst... Hast du was gegen Tutorials, insbesondere gegen die, wo man nicht mit Copy-Paste arbeiten kann? Ich hatte dir doch mal einen Link zu den deutschen Nehe-Tuts gegeben. Passend dazu habe ich auch noch die JOGL-Sourcen. Wie man Texturen an Objekte bindet steht dort in den ersten 6 Lektionen. Für ein Individuum mit Hochschulreife (wie du behauptest eines zu sein) kann es doch wohl nicht all zu schwer sein, sich die relevanten Quelltextbereiche heraus zu picken, zu vergleichen um sich dann selbst zusammenreimen zu können, wie man z.B. LWJGL oder gar C++ zu JOGL portiert. Ich hab's doch auch geschafft... und das grösstenteils sogar ohne Hilfe eines Forums und vor allem mit nur mittlerer Reife... Zeig doch einfach mal ein bissl' Engagement wenn du schlicht Spass am Proggen hast. So nach dem Motto "...euch zeig' ich's!!!".
 
Moin,

Du hast schon rausbekommen das die Textur erst gebunden werden muss ehe die dazu passende Geometrie gezeichnet wird. Zusammen mit dem gl2sample1 solltest Du damit eigentlich schon alles haben um eine zweite Textur einzubinden.

Ob das nun über ImageIO und glBindTexture() geschieht (so wie in gl2sample1) oder über TextureIO und texture.bind() (so wie in gl2sample02) ist dabei gleich.

Wie dem auch sei, hier ein Beispiel mit TextureIO und zwei Texturen:

http://too-late.de/kskb/gl2sample02.zip

Wie immer:
Eclipse -> File -> Import -> General -> Existing Projects into Workspace -> Select archive file -> Browse -> gl2sample02.zip auswählen -> Öffnen -> Finish

Gruß,
Fancy
 
ich hab mir das mal ein bisschen angeschaut.
Immerhin...
Das ist aber auch mit einer Library geschrieben,
die ich nicht habe. Ich habe doch nur das ganz normale JOGL.
Ja, mit LWJGL, das effektiv das selbe wie JOGL ist. Ein OpenGL Binding! Die Portierung dürfte sich bis auf die Buffer-Elemente 1:1 übernehmen lassen.
Geht das nciht einfacher`?
Nein, es sei denn du nutzt eine fertige Engine. Wenn du Systemnah programmieren willst, dann stehen dir lediglich ein paar Werkzeuge zur Verfügung und die Tools die du benötigst musst du dir selbst bauen.

Dass man einfach die daten aus einem bild ladet, und sie der textur zuweist.
Es gibt doch bestmmt einen ganz einfachen weg.
Wie schon gesagt wurde, ImageIO und dann entsprechend übergeben, aber ob das nun wirklich einfacher ist wage ich zu bezweifeln. Für LWJGL gäbe es SLICK als Textureloader, aber ob es sowas auch von der JOGL Community gibt...kA.

Wie lautet der noch gleich`?
Selbstinitiative, Nachdenken, viel lesen und ausprobieren.
Ich kann mich daran erinnern einen einfachen DDS Loader aus der MSDN und NVidia Doku (C++) nach LWJGL übersetzt zu haben. Das hat "nur" 3 Feierabend-Tage gedauert, bis es so lief wie es laufen sollte.

Also zeig mal bitte mehr Eigenleistung. Denn Vorkauen mag denke ich niemand hier irgendwas.

Evil
 
@Fancy: Mein Respekt steigt mit jedem Link.
Obwohl ... vielleicht ist dir ja langweilig ... (bis du Student oder arbeitslos? 😀)
 
danke vielmals fancy, was gibt es denn eig. sonst noch für glsamples, dann muss ich das Forum hier nicht mehr "belästigen" muss, jedenfalls nicht so oft.

Danke für alles Developer_X
 
Ohne das jetzt wieder in einen Flamewar oder Developer_X-bashing ausarten lassen zu wollen: DOCH, das wirst du. Zumindest werden auch noch so viele Codesamples dich nicht davon abhalten. Es gibt im Netz eine unerschöpfliche Menge an Beispielprogrammen zu JOGL. Dass sich jemand die Mühe gemacht hat, (vermutlich) speziell für dich ein paar Beispiele zu erstellen, bei denen "Entpacken, Compilieren und Starten" ein hübsches Bildchen auf den Bildschirm zaubert hilft nicht weiter oder ist nur eine Art "Symptopbekämpfung". Vorher war deine Frage "Wie mache ich Texturing?" - Wenn du jetzt ein Beispiel hast, wo eine Textur angezeigt wird, ist deine nächste Frage "Und wie kann ich die Textur jetzt animieren?" - und wenn dort jemand ein glsample0X postet, wirst du das "aufsaugen" wie ein Schwamm, und die nächste Frage stellen: "Wie kann man eine Filmdatei als Textur verwenden" (oder sonstwas) ... und so wird es immer weiter gehen, solange die Fortschritte, die du machst, daraus bestehen, Leute in einem Forum dazu zu bewegen, Lösungen für deine Probleme zu posten, und du nicht (endlich) lernst, Eigeninitiative zu zeigen, im Hinblick auf den Versuch, dir die Fähigkeit anzueignen, dir für solche Probleme selbst Lösungen zu erarbeiten.
Aber vielleicht habe ich ja auch einen vööööllig falschen Eindruck bekommen....
 
Ohne das jetzt wieder in einen Flamewar oder Developer_X-bashing ausarten lassen zu wollen: DOCH, das wirst du. Zumindest werden auch noch so viele Codesamples dich nicht davon abhalten. Es gibt im Netz eine unerschöpfliche Menge an Beispielprogrammen zu JOGL. Dass sich jemand die Mühe gemacht hat, (vermutlich) speziell für dich ein paar Beispiele zu erstellen, bei denen "Entpacken, Compilieren und Starten" ein hübsches Bildchen auf den Bildschirm zaubert hilft nicht weiter oder ist nur eine Art "Symptopbekämpfung". Vorher war deine Frage "Wie mache ich Texturing?" - Wenn du jetzt ein Beispiel hast, wo eine Textur angezeigt wird, ist deine nächste Frage "Und wie kann ich die Textur jetzt animieren?" - und wenn dort jemand ein glsample0X postet, wirst du das "aufsaugen" wie ein Schwamm, und die nächste Frage stellen: "Wie kann man eine Filmdatei als Textur verwenden" (oder sonstwas) ... und so wird es immer weiter gehen, solange die Fortschritte, die du machst, daraus bestehen, Leute in einem Forum dazu zu bewegen, Lösungen für deine Probleme zu posten, und du nicht (endlich) lernst, Eigeninitiative zu zeigen, im Hinblick auf den Versuch, dir die Fähigkeit anzueignen, dir für solche Probleme selbst Lösungen zu erarbeiten.
Aber vielleicht habe ich ja auch einen vööööllig falschen Eindruck bekommen....
Gibt's da 'ne Petition, die man unterschreiben könnte? 😀 --> signed...
 
@ Marco:
Jap, ich bin Student. 😀
Als Vertiefungsgebiet hab ich auch noch Computergrafik und so ne kleine Fingerübung kann nie schaden. 😉


@DevX:
Ein Prof von uns meinte mal, das es eigentlich egal sei ob jemand lernt oder nicht, denn solange man von außen genug Wissen anlegen würde, würde es auch durch die Schädeldecke diffundieren. Es dauerte dann nur etwas länger...

Aus Erfahrung kann ich Dir sagen, dass dies zwar grundsätzlich stimmt, aber "etwas länger" dann durchaus relativ (lange) sein kann. Darum mein Tipp, lies (besser noch bearbeite!) jedes Tutorial das Du in die Finger bekommst!

Von den gl2sample hab ich bisher nur die online die Du auch kennst. Aber in meinem Workspace liegt vermutlich für jedes OpenGL Problem auch irgendwo ein Beispiel, so dass ich bei Bedarf weitere online stellen kann (nichtsdestotrotz, solltest Du Dir das passende Wissen zu den samples aneignen, zur Not Befehl für Befehl hier nachsehen: OpenGL-Funktionsübersicht ? DGL Wiki ).

(Genaugenommen will ich mich schon seit längern mal hinsetzen und aus meinem Workspace eine JOGL / tutorial / sample / special effects Serie destillieren, allerdings soll da der Schwerpunkt auf OpenGL 3.2 / GLSL 1.5 core liegen. Aber ich befürchte, ehe Du das gebrauchen kannst, musst Du eh noch en "bissel" Grundlagen lernen.)

Gruß,
Fancy
 
@ Marco:
Jap, ich bin Student. 😀

Meine Frage war in dem Sinne unpräzise gestellt: Es ging nicht um die Frage OB du eines von beidem bist, sondern welches von beidem :bae:
Ja, so ein paar Snippets basteln ist schön, und nicht zuletzt werden der gelegentlichen "Fingerübungen" bin ich ja auch hier, aber ... wenn so lange so wenig zurückkommt wird's irgendwann frustrierend...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben