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

Aktuelle Zeit: Do Mär 28, 2024 15:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Probleme mit VBOs und Subdata
BeitragVerfasst: Fr Mai 31, 2013 19:55 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hallo,

ich bastel gerade an einem Framework mit dem ich Android und normale Java Spiele programmieren kann, aber nur eine Codebasis als Spielkern verwende und da bin ich gerade dabei die Geometrie zu laden - das mach ich mittlerweile nur noch über VBOs damit es ES 2.0 Kompatibel bleibt.

Grundsätzlich klappt das auch gut, nur nachdem ich jetzt Texture-Koordinaten dazu gefügt habe und natürlich auch eine passende Texture geladen haben, bleibt mein Objekt Schwarz (clearColor ist grün) :-(

Ich tippe darauf das es damit zu tun, wie ich die Geometry Daten in den VBO verpacke und genau da bräuchte ich ein wenig Hilfe.
Bisher mache ich das so, ich erzeuge ein VBO das die größe von allen Positions/Texcoords im GPU-Speicher anlegt mit glBufferData ohne Daten reinzugeben. Danach schreibe ich die Positonsdaten ab Offset mit glBufferSubData rein. Direkt dahinter kommen die Texturekoordinaten mit dem Offset der Größe der Positionsdaten. Also so: VBO = Alle Postionen + Alle Texture Koordinaten
Das weicht schonmal komplett ab, wie ich es noch in Erinnerung habe, sollte aber eigentlich funktionieren - korrigiert mich wenn ich falsch liege.
Natürlich wird ebenfalls noch ein passender Element/Index Buffer erzeugt, Postionen und Texcoords haben ja beide die gleiche länge, sollte also gehen.

Das Rendern läuft so ab:

(Aktivieren = Einschalten und Binden)

Code:
  1. - Texture0 aktivieren
  2. - Shader aktivieren und uniforms setzten
  3. - VBO aktivieren
  4. - glEnableVertexAttribArray für vPositon
  5. - glVertexAttribPointer für vPosition, 3 Komponenten, 3 * Bytes.FLOAT_SIZE, Offset 0
  6.  
  7. - glEnableVertexAttribArray für vTexcoord
  8. - glVertexAttribPointer für vTexcoord, 2 Komponenten, 2 * Bytes.FLOAT_SIZE, Offset Bytegröße der gesamten Positionsdaten
  9.  
  10. - IBO aktivieren
  11. - glDrawElements
  12. - IBO deaktivieren
  13.  
  14. - glDisableVertexAttribArray für vTexcoord
  15. - glDisableVertexAttribArray für vPosition
  16. - VBO deaktivieren
  17. - Shader deaktivieren
  18. - Texture0 deaktivieren
  19.  


Der Shader ist noch ziemlich übersichtlich:

Code:
  1.  
  2. attribute vec4 vPosition;
  3. attribute vec2 vTexcoord;
  4. uniform mat4 uMVPMatrix;
  5. varying vec2 texcoord;
  6. void main() {
  7.     gl_Position = vPosition * uMVPMatrix;
  8.     texcoord = vTexcoord;
  9. }
  10.  


Code:
  1.  
  2. uniform vec4 uColor;
  3. uniform sampler2D uTex;
  4. varying vec2 texcoord;
  5. void main() {
  6.     vec4 texColor = texture2D(uTex, texcoord);
  7.     gl_FragColor = texColor;
  8. }
  9.  


Gibt es denn nen einfachen Trick im Fragment Shader, wie ich die Texture-Koordinaten Visualisieren kann?
Damit könnte ich prüfen ob die Koordinaten übernimmt passen, da vermute ich nämlich das hier der Hund begraben ist.

Wär dankbar für ein paar Tips, ist jetzt schon wieder ein paar Jahre her seit ich das letzte mal tiefer in die regionen der VBOs gedrungen bin :(

Grüße,
Final


Zuletzt geändert von Finalspace am Sa Jun 01, 2013 14:59, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Gibt es denn nen einfachen Trick im Fragment Shader, wie ich die Texture-Koordinaten Visualisieren kann?

Da diese zwischen 0 und 1 liegen wie die Farben kannst du sie ja z.B. einfach in den roten und grünen Farbkanal schreiben.

Sollte der Stride bei den Texcoords nicht 2*Float sein?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 14:59 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Coolcat hat geschrieben:
Zitat:
Gibt es denn nen einfachen Trick im Fragment Shader, wie ich die Texture-Koordinaten Visualisieren kann?

Da diese zwischen 0 und 1 liegen wie die Farben kannst du sie ja z.B. einfach in den roten und grünen Farbkanal schreiben.

Sollte der Stride bei den Texcoords nicht 2*Float sein?


Ja natürlich, das soll 2 * float sein :D Hab das wohl aus meinem Code raus falsch kopiert, hab den post angepasst.
Hab die Texture-Coords mal als Farbe ausgeben lassen wie du empfohlen hattest.
Scheint wohl zu passen, weil das sieht soweit in Ordnung aus -> Siehe anlage.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 15:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Jo, sieht richtig aus. Ich denke mal die Textur wird falsch gebunden. Ich rate mal ins blaue:

Die Uniform uTex muss auf 0 (für Textureinheit 0) gesetzt werden, nicht etwa auf die ID des Texturobjektes. Letztere setzt du ganz klassisch via glActiveTexture und glBindTexture.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 16:55 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Coolcat hat geschrieben:
Jo, sieht richtig aus. Ich denke mal die Textur wird falsch gebunden. Ich rate mal ins blaue:

Die Uniform uTex muss auf 0 (für Textureinheit 0) gesetzt werden, nicht etwa auf die ID des Texturobjektes. Letztere setzt du ganz klassisch via glActiveTexture und glBindTexture.


Hmm komisch, das sollte also stimmen wie ich die Texture binde:

// Aktivieren
GL13.glActiveTexture(GL13.GL_TEXTURE0 + index);
GL11.glEnable(getTarget());
GL11.glBindTexture(getTarget(), getHandle());

// Deaktivieren
GL13.glActiveTexture(GL13.GL_TEXTURE0 + index);
GL11.glBindTexture(getTarget(), 0);
GL11.glDisable(getTarget());

Und uniform und active texture index ist ebenfalls 0.

Hmm, gerade die Uniforms überprüft... uTex hat wohl ne merkwürdige location:
"Added uniform 'uTex' location: 65536" - womöglich ist dass das problem?
Ich cache ja die uniform und attrib locations in einer Hashmap, damit ich das später nicht mehr machen muss und die Uniforms und Attribs werden aus dem Shader code automatisch aufgelöst. Generell funktioniert das bisher ganz gut. Siehe auszug aus dem Log:

Code:
  1.  
  2. Added attribute 'vPosition' location: 1
  3. Added attribute 'vTexcoord' location: 0
  4. Added uniform 'uMVPMatrix' location: 0
  5. Added uniform 'uColor' location: -1
  6. Added uniform 'uTex' location: 65536
  7.  


uColor wird nicht benutzt, dann liefert das auch keine location, aber uTex wird verwendet :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 17:46 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also ich poste jetzt doch mal ein wenig code, denn ich verzweifel langsam.
Das sieht alles richtig aus, nur das Ergebnis ist mal wieder fail.

So lade ich Texturen:
Code:
  1.  
  2.     public Texture2D loadTexture2D(final String name, final InputStream imageStream) throws TextureException {
  3.         BufferedImage image;
  4.         try {
  5.             image = ImageIO.read(imageStream);
  6.         } catch (IOException e) {
  7.             throw new TextureException("Could not read texture '"+name+"'!", e);
  8.         }
  9.        
  10.         int width = image.getWidth();
  11.         int height = image.getHeight();
  12.  
  13.         ByteBuffer data = LWJGLUtils.getImageData(image);
  14.        
  15.         int handle = GL11.glGenTextures();
  16.         int target = GL11.GL_TEXTURE_2D;
  17.         GL11.glBindTexture(target, handle);
  18.         GL11.glTexParameteri(target, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
  19.         GL11.glTexParameteri(target, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
  20.         GL11.glTexParameterf(target, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
  21.         GL11.glTexParameterf(target, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
  22.         GL11.glBindTexture(target, 0);
  23.         GL11.glTexImage2D(target, 0, GL11.GL_RGBA8, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data);
  24.         return new LWJGLTexture2D(handle, target, width, height);
  25.     }
  26.  


Und as rendern:
Code:
  1.    
  2. private void drawMesh(final BufferedMesh mesh) {
  3.    
  4.         stateMgr.enableShader(simpleShader);
  5.         simpleShader.uniformMat4("uMVPMatrix", mvp);
  6.         simpleShader.uniformVec4("uColor", 1.0f, 0.5f, 0.25f, 1.0f);
  7.         simpleShader.uniformInt("uTex", 0);
  8.  
  9.         stateMgr.enableTexture(testTexture, 0);
  10.  
  11.         VertexBuffer vbo = mesh.getVbo();
  12.         IndexBuffer ibo = mesh.getIbo();
  13.  
  14.         stateMgr.enableVertexBuffer(vbo);
  15.  
  16.         simpleShader.enableVertexAttribArray("vPosition");
  17.         simpleShader.setVertexAttribPointer("vPosition", 3,
  18.                 3 * Bytes.FLOAT_SIZE, 0);
  19.        
  20.         simpleShader.enableVertexAttribArray("vTexcoord");
  21.         simpleShader.setVertexAttribPointer("vTexcoord", 2,
  22.                 2 * Bytes.FLOAT_SIZE, mesh.getTexcoordOffset());
  23.  
  24.         if (ibo != null) {
  25.             stateMgr.enableIndexBuffer(ibo);
  26.             ibo.drawElements(DrawMode.Triangles, mesh.getIndexCount());
  27.             stateMgr.disableIndexBuffer();
  28.         } else {
  29.             vbo.drawArrays(DrawMode.Triangles, 0, mesh.getVertexCount());
  30.         }
  31.  
  32.         simpleShader.disableVertexAttribArray("vTexcoord");
  33.         simpleShader.disableVertexAttribArray("vPosition");
  34.  
  35.         stateMgr.disableVertexBuffer();
  36.  
  37.         stateMgr.disableTexture(0);
  38.  
  39.         stateMgr.disableShader();
  40.        
  41.     }
  42.  


Das ganze ist zwar alles abstrahiert gehalten, sollte aber Verständlich sein.

Ich werd mal GDebugger anwerfen und schauen ob er die Texture richtig geladen hat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 20:17 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So hab gDEBugger drüber laufen lassen und die Texture wurde erfolgreich geladen, allerdings sagt er das das Interne Pixel Format anderst sei, als das Requested format. Somit leider das Problem immer noch nicht behoben :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 21:30 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ich bin ratlos.

Habe nun eine kleine test LWJGL Applikation gebaut, welches 1 zu 1 genau das gleiche macht, was ich auch mache und der selbe Fehler: Rechteck bleibt schwarz :( Komischerweise wenn ich die uMVPMatrix weglasse (In dem Test habe ich diese absichtlich weggelassen), dann hat auch meine sampler2D uniform location keine 65536 als index, sonder eine 0. Was zur Hölle ist da faul?

Hab den Code mal hochgeladen: http://pastebin.com/b0cyzmqt

Das Eclipse Projekt kann ich bei bedarf ebenfalls hochladen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Sa Jun 01, 2013 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Manche Grafiktreiber kommen nicht auf ungenutzen uniforms klar. Also ggf. liegt es einfach an uColor. Also entweder rauswerfen oder benutzen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: So Jun 02, 2013 21:07 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Coolcat hat geschrieben:
Manche Grafiktreiber kommen nicht auf ungenutzen uniforms klar. Also ggf. liegt es einfach an uColor. Also entweder rauswerfen oder benutzen.


Den Code den ich gepostet habe, der hat das uColor uniform gar nicht mehr gehabt - dennoch gleiches Problem.
Und die location des Samples wird 65536 sobald ich die uMVPMatrix mit der Position multipliere O_o


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: So Jun 02, 2013 21:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Gibt der Shaderkompiler vielleicht irgendwelche Warnings raus?
(Ggf. mal absichtlich einen fehlerhaften Shader bauen um zu testen ob die Fehlerausgabe funktioniert)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Mo Jun 03, 2013 03:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Mh. In meinen Shadern steht die Matrix vorne. Aber eigentlich dürfte er dann nur falsch projezieren und nicht "gar nichts" machen.
Code:
  1. gl_Position = uMVPMatrix * vPosition;

_________________
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: Probleme mit VBOs und Subdata
BeitragVerfasst: Mo Jun 03, 2013 06:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Mh. In meinen Shadern steht die Matrix vorne

Wahrscheinlich sind in der Matrix die Zeilen und Spalten vertauscht, dann stimmt es wieder ;)

Es besteht auch noch die Möglichkeit das die 65536 schlicht korrekt ist und es sich bei deiner Grafikkarte da schlicht um den Speicher in der Texturunit handelt oder sowas. Fragt sich dann aber natürlich was den dann das Problem ist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Mo Jun 03, 2013 19:35 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So ich hab jetzt ein paar weitere Tests gemacht mit dem Test-Code.
Absichtlicher Fehler produzieren im Shader wird sauber erkannt und wirft die korrekte Exception.
Hab nun auch den uMVPMatrix hinzugefügt mit einer Identitätsmatrix als Daten, das reicht ja ums zu testen. Gleiches Problem.

Hier der geänderte Code:
http://pastebin.com/h3nyT8tw

Ich werde mal ne JAR bauen, dann könnt ihr das gerne mal direkt ausprobieren -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit VBOs und Subdata
BeitragVerfasst: Mo Jun 03, 2013 20:04 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So hab das ganze nun mal als JAR gebaut und ich hab das ganze Projekt mal gezippt mit LWJGL.

http://root.xenorate.com/final/LWJGLTest.zip

Es wäre wirklich Klasse wenn ihr euch das mal anschauen könnt.
JAR also eine ausführbare java applikation liegt im "dist" ordner - startet ihr am besten über die console "java -jar texturefail.jar".

Danke und Gruß,
Final

Und ein kleines Q3 Trickjump Video von mir zum gemütlich chillen:
http://www.youtube.com/watch?v=x-ScsQD92BY


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 29 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.051s | 17 Queries | GZIP : On ]