Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:20

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Nov 18, 2009 09:39 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Hi Community,

ich bin gerade dabei ein OpenGL Projekt auf Java zu portieren und es treten doch einige Probleme auf.
Hier möchte ich aber nur auf das oben beschriebene Problem eingehen. In Delphi habe ich folgende Befehlsfolge benutzt um die Transparenz meiner TGA Textur zu nutzen:

Code:
  1. //Alphatest zur Erkennung der Transparenz anhand der Textur
  2.   glEnable(GL_ALPHA_TEST);
  3.   glAlphaFunc(GL_GREATER, 0.1);
  4.  
  5.   //Blending zur Behebung der weißen Ränder wegen des Alphatests
  6.   glEnable(GL_BLEND);
  7.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  8.  


Leider scheint das nicht 1 zu 1 übertragbar zu sein. Ein Grund könnte sein, dass ich die Textur anders lade und binde.

Delphi:
Code:
  1.  
  2. // Texturbind
  3.     glEnable(GL_TEXTURE_2D);
  4.     glBindTexture(GL_TEXTURE_2D, Texture.Texture);
  5.  


Texture.Texture ist vom Typ gluInt

Java:
Code:
  1.  
  2. // Texturbind
  3.   gl.glEnable(GL.GL_TEXTURE_2D);
  4.   gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE,   GL.GL_DECAL);
  5.   tex.getTexture().bind();
  6.  


Ich benutze hierfür die Textur die Java Klasse "com.sun.opengl.util.texture.Texture".

In meiner Java Anwendung wird meine Textur nun nicht korrekt angezeigt, sprich der transparente Teil ist komplett weiß. Laut API sollten die Aufrufe folgendermaßen aussehen:

Code:
  1. //Alphatest zur Erkennung der Transparenz anhand der Textur
  2.         gl.glEnable(GL.GL_ALPHA_TEST);
  3.         gl.glAlphaFunc(GL.GL_GREATER, 0.1f);
  4.        
  5.         //Blending zur Behebung der weißen Ränder wegen dem Alphatest
  6.         gl.glEnable(GL.GL_BLEND);
  7.         gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA);


Führt aber auch nicht zum erwünschten Ergebnis. Liegt es am Loader oder übersehe ich hier einfach was?

Vielen Dank
MB


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 11:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wo hast den denn deinen Java Code her?
OpenGL ist Sprachunabhängig. Die Befehle müssen also das gleiche machen, wenn du sie in der gleichen Reihenfolge in beiden Sprachen verwendest.
Zum Laden von Transparenten Texturen musst du mal im Netz suchen. Ich hab gerade keinen Code zur Hand.
Empfehlen würde ich dir statt TGA PNGs. Die sind deutlich kleiner als TGAs und soweit ich weiß auch kein Proprietäres Format (oder?).

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Welchen Code meinst du speziell? Den zum Laden der Textur? Bin mir nicht mehr sicher, aber ich denke das war irgendein Tutorial, das ich zufällig im Netz gefunden habe. Den Link habe ich leider nicht mehr.

Code:
  1. private Texture loadTexture(String fnm){
  2.         String fileName = fnm;
  3.         Texture tex = null;
  4.        
  5.         try {
  6.             tex = TextureIO.newTexture( new File(fileName), false);
  7.             tex.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
  8.             tex.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
  9.         }
  10.         catch(Exception e)
  11.         {  
  12.             System.out.println("Error loading texture " + fileName);
  13.             System.out.println(e.getClass() + " " + e.getMessage());
  14.         }
  15.         return tex;
  16.     }


TGA wurde damals im 2d Tutorial empfohlen und seitdem habe ich es benutzt. Ich werde mich dann aber mal nach einen PNG Loader umsehen.
Ich habe aber irgendwie das Gefühl, dass die Klasse evtl noch irgendeinen Parameter braucht.

Evtl.

Code:
  1.  
  2. tex.setTexParameteri(GL.GL_ALPHA, ?);
  3.  

?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 13:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Update:

Es lag scheinbar am Loader bzw. an der entsprechenden Texturklasse.

Habe testweise folgenden Loader implementiert:
http://www.java-tips.org/other-api-tips ... -jogl.html

Damit funktioniert es wunderbar.

Danke für die Antwort @ Flash
Gruß
MB


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 13:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Hattest du beim laden der TGA sichergestellt das du RGB_A bzw. GBR_A bei TGA mit Alphakanal verwendet hast?
Sonst hier noch nen TGA Loader der mittels LWJGL realisiert ist. Sollte sich sehr leicht nach JOGL portieren lassen.
http://lwjgl.org/wiki/doku.php/lwjgl/tu ... xtures/tga

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 13:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
ich glaube wir sollten mal die Formatempfehlung im 2D Tutorial aktualisieren. Laut Wikipedia können TGA Dateien nur von wenigen Programmen erstellt werden. (Z.B. Gimp und Photoshop) Entweder Wikipedia liegt hier falsch (was möglich ist) oder Sascha.

Dann schreibt Sascha, dass es keine guten Loader gibt die ohne DLLs und zusatzlibs auskommen. Ist das auch heute noch so?
Lossy bietet bei der glBitmap ja auch nur eine Brücke zu PNG Loadern an. Ich persönlich finde PNGs äußerst praktisch, da sie wirklich fast überall erstellt werden können.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 14:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Ja, die TGA Unterstützung ist außerhalb von Spielen u. Wissenschaft? sehr mager. Da stimmt der Wikipedia Artikel schon. ;)

PNG ist zwar kleiner, aber bei Java muss man diese erst mMn umständlich konvertieren und kann sie nicht direkt laden wie TGA und DDS. Wobei letzteres in den meisten Fällen die nahezu beste Wahl ist.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 14:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also...ich bin mir da gerade nicht sicher. Ich hab meinen Code leider nicht zur Hand sonst könnte ich mal nachgucken. Aber dass es keine offene PNG Lade Lib gibt, zeigt doch nur, dass mal jemand eine schreiben könnte. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Gibt es doch? Zb. Slick für LWJGL. Aber wie gesagt ist es umständlich. Erst mittels ImageIO das PNG laden, dann den Inhalt entsprechend auslesen und verarbeiten und dann an den Buffer senden. Mag sein, dass es bereits ohne ImageIO läuft, aber die Daten erst aus einem BufferedImage herauszulesen ist grotesk.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 18, 2009 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

ich weiß nicht ob es einen Unterschied gemacht hätte, aber

Code:
  1. gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE,   GL.GL_DECAL);
  2. tex.getTexture().bind();


sollte eigentlich in der Reihenfolge richtig sein

Code:
  1. tex.getTexture().bind();
  2. gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE,   GL.GL_DECAL);
  3.  



Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]