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

Aktuelle Zeit: Mo Apr 29, 2024 11:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Java - ByteBuffer
BeitragVerfasst: Mi Jan 01, 2014 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Verstehe ich das richtig ?

Bei Java muss man einen Umweg über ByteBuffer machen, weil Java keine Pointer kennt.

Beispiel:
Code:
  1. ByteBuffer bb; 
  2. bb = ByteBuffer.allocateDirect(DreieckVector.length * 4);
  3. bb.order(ByteOrder.nativeOrder());
  4. DreieckVectorBuffer = bb.asFloatBuffer();
  5. DreieckVectorBuffer.put(DreieckVector);
  6. DreieckVectorBuffer.position(0);
  7.  
  8. ...
  9.  
  10. GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, DreieckVectorBuffer);
  11.  

In Delphi kann man @ machen.
Code:
  1. glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, @DreieckVector);

_________________
OpenGL


Zuletzt geändert von mathias am Mi Jan 01, 2014 18:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Mi Jan 01, 2014 17:45 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja, hast du richtig verstanden.
Bei Java wirst du dich darauf einstellen müssen, dass es einige Dinge nicht kennt, die für effektives OpenGL eigentlich notwenig sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Do Feb 20, 2014 23:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich wollte die Initialisierung des Bytebuffer in eine Funktion packen, aber ohne Erfolg.
Die Vectoren übernimmt er richtig, aber mit den Normalen stimmt etwas nicht mehr.
Bei späteren Objecten übernimmt er nicht mal mehr die Vectordaten richig.
Mit dem ausgeklammerten Teil funktioniert es ohne Fehler.

FluegeliVector enthält die Vectordaten in einer Float Array.
FluegeliVectorBuffer wird für glVertexAttribPointer gebraucht.

In Java bin ich noch ein sehr starker Anfänger. :wink

Edit: Ups, habe den Fehler gesehen, werde es Morgen nochmals probieren.

Code:
  1. public static FloatBuffer buffer(float vectoren[]) {
  2.         ByteBuffer bb;
  3.         FloatBuffer VectorBuffer;
  4.         bb = ByteBuffer.allocateDirect(FluegeliVector.length * 4);
  5.         bb.order(ByteOrder.nativeOrder());
  6.         VectorBuffer = bb.asFloatBuffer();
  7.         VectorBuffer.put(FluegeliVector);
  8.         VectorBuffer.position(0);
  9.  
  10.         return VectorBuffer;
  11.     }
  12.  
  13.     public Triangle() {
  14.  
  15.         // Flügeli
  16.  
  17.         FluegeliVectorBuffer = buffer(FluegeliVector);
  18.         FluegeliNormalBuffer = buffer(FluegeliNormal);
  19.  
  20.         // ByteBuffer bb;
  21.  
  22.         // bb = ByteBuffer.allocateDirect(FluegeliVector.length * 4);
  23.         // bb.order(ByteOrder.nativeOrder());
  24.         // FluegeliVectorBuffer = bb.asFloatBuffer();
  25.         // FluegeliVectorBuffer.put(FluegeliVector);
  26.         // FluegeliVectorBuffer.position(0);
  27.  
  28.         // bb = ByteBuffer.allocateDirect(FluegeliNormal.length * 4);
  29.         // bb.order(ByteOrder.nativeOrder());
  30.         // FluegeliNormalBuffer = bb.asFloatBuffer();
  31.         // FluegeliNormalBuffer.put(FluegeliNormal);
  32.         // FluegeliNormalBuffer.position(0);

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Fr Feb 21, 2014 09:01 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich nehme an du nutzt LWJGL? Falls ja, da ist eine Klasse BufferUtils dabei. Die hilft beim erstellen der Buffer.

btw: Du solltest dir angewöhnen, Variablen klein zu schreiben. Erhöht ungemein die Lesbarkeit.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Fr Feb 21, 2014 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Ich nehme an du nutzt LWJGL?

Der Auschnit ist von einem Android-Programm

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Fr Feb 21, 2014 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Gut. Aber trotzdem könntest du mal in das Repository von LWJGL schauen, da wär die BufferUtil-Klasse drin. Vielleicht kann man da was adaptieren.... :)

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Fr Feb 21, 2014 23:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe es jetzt so gelöst und funktioniert gut. Vielleicht kennt jemand eine bessere Lösung.
Code:
  1.     public static FloatBuffer GetBuffer(float vectoren[]) {
  2.         ByteBuffer bb;
  3.         FloatBuffer VectorBuffer;
  4.         bb = ByteBuffer.allocateDirect(vectoren.length * 4);
  5.         bb.order(ByteOrder.nativeOrder());
  6.         VectorBuffer = bb.asFloatBuffer();
  7.         VectorBuffer.put(vectoren);
  8.         VectorBuffer.position(0);
  9.  
  10.         return VectorBuffer;
  11.     }
  12.  
  13.     private final FloatBuffer FluegeliVectorBuffer = GetBuffer(FluegeliVectoren.FluegeliVectoren);
  14.     private final FloatBuffer FluegeliNormalBuffer = GetBuffer(FluegeliNormale.FluegeliNormale);

Ich habe mir LWJGL angeguckt, sehe aber keinen Vorteil dies einzubinden.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Fr Apr 11, 2014 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 04, 2014 16:18
Beiträge: 6
Wohnort: 8700
Programmiersprache: Html
Hi, ich interessiere mich auch für den ByteBuffer. Kann mir jemand mal kurz erklären, wie dieser aufgebaut ist? Außerdem hätte ich noch eine Frage: Ich habe in der Java-Programmierung oft schon eine NullPointerException erlebt. Ist dies nicht auch eine Art eines Pointers? Kann man diesen nicht auch irgendwie anders verwenden?

_________________
http://www.keygles.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: So Mai 04, 2014 16:31 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Kommt ein wenig später die Antwort. Ist aber die Folge, wenn man fremde Threads highjacked.

Zitat:
Hi, ich interessiere mich auch für den ByteBuffer. Kann mir jemand mal kurz erklären, wie dieser aufgebaut ist?


Die interne Struktur des Buffers sollte in 99% der Fälle keine Rolle spielen. Stelle es Dir vor als eine Aneinanderreihung vom Datentype hintereinander ein. Bedenke das bei OpenGL Dinge häufig anders herum erwartet werden BGR statt RGB. Das kannst dann leicht mit der Methode flip() entsprechend drehen.

Aber zurück zu z.B. den IntBuffer. Ein Anwendungsfall ist z.B.
Code:
  1.  
  2.         IntBuffer drawBuffs = BufferUtils.createIntBuffer(1);
  3.         drawBuffs.put(0, GL30.GL_COLOR_ATTACHMENT0);
  4.        
  5.         GL20.glDrawBuffers(drawBuffs);
  6.  


Sollte eigentlich recht selbsterklärend sein. Es wird ein Buffer mit genau einem Element erzeugt. Danach füllen wir einen Int wert an der ersten Stelle ein und übergeben den Buffer an die OpenGL-Methode. Die Arbeit in Java und Buffer ist anfangs ein wenig gewöhnungsbedürftig, allerdings erzieht sie einem dazu vernünftig zu kapseln.

Zitat:
Ich habe in der Java-Programmierung oft schon eine NullPointerException erlebt. Ist dies nicht auch eine Art eines Pointers? Kann man diesen nicht auch irgendwie anders verwenden?

In Java gibt es keine Pointer. Es gibt aber natürlich Objektreferenzen, die naiv betrachtet nichts wesentlich anderes sind, außer das sichergestellt ist, dass die nicht plötzlich irgendwo in einem Speicherbereich landen, wo sie nichts zu suchen haben. Eine NPE ist eine Null-Referenz zeigt also ins Nirwana und somit einem nicht existierenden Objekt. Sie fliegt dann, wenn Du beginnst auf das Objekt das dort referenziert wurde zuzugreifen. Viele NPE in Anwendungen zeugen von einer schlampigen Qualität des Codes und sollten in der Praxis nicht auftreten. Üblicherweise hat der Entwickler vergessen ein Objekt zu initalisieren oder erwartet von einer Rückgabe eines Interfaces einen anderen Datentyp. Womit wir zum nächsten Grundsatz kommen "Null" ist keine Information ;)

Code:
  1.  
  2. // Beim Zugriff auf s fliegt eine NPE. Das Objekt existiert nicht
  3. String s = null;
  4. s.toLowerCase();
  5.  
  6. // Man muss sich schon bemühen. Bei einer Nicht-Initalisierung meckert sogar der Compiler
  7. s.toLowerCase();
  8.  
  9. // Funktioniert einwandfrei
  10. String s = new String("Hallo Welt");
  11. s.toLowerCase();
  12.  

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: So Mai 04, 2014 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Zitat:
Das kannst dann leicht mit der Methode flip() entsprechend drehen.

Ehm nein. Diese Methode dreht nicht den Inhalt des Buffers um. Sie setzt das Limit auf die aktuelle Position und die Position auf 0.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Java - ByteBuffer
BeitragVerfasst: Mo Mai 05, 2014 07:54 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Das kommt davon, wenn man glaubt auch ohne installierten Code auszukommen. Damadmax hat natürlich recht und erzeugt bei mir gerade etwas stirnrunzeln.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.109s | 21 Queries | GZIP : On ]