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

Aktuelle Zeit: Fr Jul 18, 2025 08:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Okt 10, 2009 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Moin,
ich bastele gerade ein wenig mit der WebGL-Implementierung von Firefox 3.7a1pre ("Minefield" / Nightly-Build). WebGL ist ein JavaScript-Binding für OpenGL ES 2.0. Das erlaubt Hardware-3D-Grafik, sogar Shader im Browser ohne Plugins.

Kann mir jemand sagen, warum mein VBO größer sein muss als eigentlich nötig?
Ich habe einen VBO mit drei Vertices. Jeder Vertex besitzt eine Position, eine Normale und eine 2D-Texturkoordinate. Mein Code sieht so aus:
Code:
  1.     var vertices = [
  2.         // px py pz | nx ny nz | tu tv
  3.          0.0,  0.5,  0.0,  0.0,  0.0,  1.0,  0.5,  0.0,
  4.         -0.5, -0.5,  0.0,  0.0,  0.0,  1.0,  0.0,  1.0,
  5.          0.5, -0.5,  0.0,  0.0,  0.0,  1.0,  1.0,  1.0,
  6.  
  7.  
  8.         0.0, 0.0, 0.0  // Zusätzliche Werte um den VBO zu vergrößern, bei weniger als 3 => Crash
  9.     ];
  10.  
  11.     var vbo = gl.createBuffer();
  12.     gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  13.     gl.bufferData(gl.ARRAY_BUFFER, new CanvasFloatArray(vertices), gl.STATIC_DRAW);
  14.  
  15.     gl.enableVertexAttribArray(0);
  16.     gl.enableVertexAttribArray(1);
  17.     gl.enableVertexAttribArray(2);
  18.     gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 8, 0);
  19.     gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 8, 3);
  20.     gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8, 6);
  21.  
  22.     // ...
  23.  
  24.     gl.drawArrays(gl.TRIANGLES, 0, 3);


Wenn mein VBO groß genug ist funktioniert alles, Positionen und Texcoords sehen korrekt aus.
Wenn mein VBO um einen Wert kleiner ist erhalte ich die folgende Meldung in Kombination mit einem Crash (JavaScript terminiert)
Code:
  1. VBO too small for bound attrib index 1: need at least 27 elements, but have only 26
  2.  
  3. Error: uncaught exception: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsICanvasRenderingContextWebGL.drawArrays]"  nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)"  location: "JS frame :: file:///mnt/data/edit/webgl/test1/test.html :: draw :: line 207"  data: no]


Zeile 207 ist das glDrawArrays.

Ich habe auch probiert die Daten hintereinander (also getrennt) in den VBO zu legen. Das funktioniert, ohne das der Buffer größer sein muss. Also zumindest die Sache mit dem Offset an der Stelle wo normalerweise der Pointer zum Array sein sollte (wenn kein VBO benutzt wird) funktioniert.

Was mache ich hier falsch?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 11, 2009 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Bug in Firefox...siehe:
https://bugzilla.mozilla.org/show_bug.cgi?id=521667
http://www.opengl.org/discussion_boards ... ber=265438

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 12, 2009 10:44 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Code:
  1.    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 8, 0);
  2.    gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 8, 3);
  3.    gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8, 6);


Mal so ganz nebenbei:
Der 5. und 6. Parameter erwartet doch einen BYTE Offset oder? Wäre das in deinem fall nicht
Code:
  1. sizeof(float) * 8
an 5. steller und jeweils
Code:
  1. sizeof(float) * 3
und
Code:
  1. sizeof(float) * 6
an 6. Stelle?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 12, 2009 11:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Eigentlich schon, aber es macht keinen Sinn irgendwo zwischen zwei floats einen Offset zu setzen. Daher ist das bei dieser JavaScript-Implementierung wohl so.

Würde nur dann Sinn machen, wenn man verschiedene Datentypen mischen kann. Ich glaube nicht das dies hier geht, da es nur dieses CanvasFloatArray gibt. Aber das ganze ist auch grauenhaft (= quasi gar nicht) dokumentiert. Ich wühle mittlerweile ja schon im Quellcode von Firefox um wenigstens irgendeinen Anhaltspunkt für einige Dinge zu haben.

Quellcode des HTML5 Canvas in Firefox:
http://mxr.mozilla.org/mozilla-central/ ... anvas/src/

Ich arbeite übrigens gerade an einem Wrapper für das GoogleWebToolkit. Ich will zumindest Klassen für Shader, Texturen usw. haben sowie einige Mathe-Klassen. JavaScript ist einfach eine grauenhafte Sprache, gerade für größere Projekte. Das GoogleWebToolkit macht die Sache dann viel einfacher, weil man so wenigstens in Java coden kann. Ziel ist übrigens ein kleines WebGL/AJAX-Browsergame, aber das wir noch dauern.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 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.008s | 17 Queries | GZIP : On ]