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

Aktuelle Zeit: So Jul 13, 2025 04:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Jul 20, 2008 15:00 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
Hallo :D

Ich will folgendes machen: Per Transform-Feedback die Werte von einem Varying Wert aus meinem Vertex-Shader bekommen.

Ich mache seit zwei Tagen nix anderes als den Fehler zu suchen, wieso mein Transform-Feedback nicht funktioniert und bevor Gedanken wie der Sprung aus dem Fenster aufkommen, dacht ich ich frag mal hier nach ob mir jemand helfen kann :P Hab zwar gemerkt, dass Transform-Feedback hier nicht gross behandelt wurde und auch per google ist nicht viel zu finden, ich hab mich dann halt durch die Spezifikation von NVidia durchgearbeitet. Im Prinzip funktioniert alles, nur dass mein Buffer nach dem Feedback immer leer bleibt...

Der Vertexshader sieht zum Test ganz eifach aus:
Code:
  1.  
  2. varying vec4 aTest;
  3.  
  4. void main(void)
  5. {
  6.   // die Variable einfach mal setzen, transformation macht keinen Sinn, ist aber nur ein Test
  7.   aTest = gl_Vertex;
  8.    
  9.   gl_Position = aTest;
  10. }                          
  11.  


Bei der Initialisierung (keine Details über die Shaderprogramme etc. dieses ist bereits erstellt und gelinkt, es geht mir nur um die Transform-Feedback Befehle):
Code:
  1.  
  2. // Programm zwingen, die Variable als Aktiv zu setzen, anschliessend Programm neu linken
  3. glActiveVaryingNV(pShaderProgram, PGLCharARB(PChar('aTest')));
  4.  
  5. // Lokationen der gewünschten Varying ("aTest") an ein Array (da ev. später mehrere simultan genutzt) übergeben. Die Lokation ist korrekt, habe ich getestet (Wert 0)
  6. pFeedbackVaryings[0] := glGetVaryingLocationNV(pShaderProgram, PGLCharARB(PChar('aTest')));
  7.  
  8. // Dem Shader-Programm zuweisen, welche Varyings später als Feedback benutzt werden
  9. glTransformFeedbackVaryingsNV(pShaderProgram, 1, @pFeedbackVaryings, GL_SEPARATE_ATTRIBS_NV);
  10.  
  11. // VBO erstellen in welches später die Daten geschrieben werden
  12. glGenBuffersARB(1, @pVBOFeedback);
  13. glBindBufferARB(GL_ARRAY_BUFFER_ARB, pVBOFeedback);
  14. // Grösse des VBOs setzen (tVector 4 ist ein record mit x,y,z,w als single)
  15. glBufferDataARB(GL_ARRAY_BUFFER_ARB, pVerticesCount * SizeOf(tVector4), nil, GL_STATIC_DRAW);
  16.  
  17. // Für die spätere Überprüfung was geschrieben wurde, ein Query-Objekt erstellen
  18. glGenQueries(1, @pFeedbackQuery);
  19.  


Dann geht's weiter in der eigentlich Prozedur, wo ich das Feedback einbinde
Code:
  1.  
  2. // zuvor ertstellten VBO als Feedback-Buffer binden
  3. glBindBufferBaseNV(GL_TRANSFORM_FEEDBACK_BUFFER_NV, 0, pVBOFeedback);
  4.  
  5. // Starten des Feedbacks
  6. glBeginTransformFeedbackNV(GL_POINTS);
  7.  
  8. // Rasterizer wird nicht benötigt > keine Anzeige
  9. glEnable(GL_RASTERIZER_DISCARD_NV);
  10.  
  11. // Zur Überprüfung Query starten um zu zählen, wie viele Primitive in den VBO geschrieben werden
  12. glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV, pFeedbackQuery);
  13.  
  14. // Das Shaderprogramm mit oben beschriebenen Testshader binden
  15. glUseProgramObjectARB(pShaderProgram);
  16.  
  17. // Jetzt mein Source-VBO binden (woher die Ursprungsvertices kommen) und rendern
  18. glEnableClientState(GL_VERTEX_ARRAY);
  19. glBindBufferARB(GL_ARRAY_BUFFER_ARB, pVBOSource);
  20. glVertexPointer(4, GL_FLOAT, SizeOf(tVector4), nil);
  21. glDrawArrays(GL_POINTS, 0, pVerticesCount);
  22. glDisableClientState(GL_VERTEX_ARRAY);
  23.  
  24. // Überprüfung der Aufzeichnung stoppen
  25. glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV);
  26.  
  27. // Feedback beenden
  28. glDisable(GL_RASTERIZER_DISCARD_NV);
  29. glEndTransformFeedbackNV;
  30.  


So, das wär's eigentlich. Wenn ich jetzt über diesen Code abfrage, wieviele Primitives in meinen pVBOFeedback geschrieben wurde
Code:
  1.  
  2. // pQueryResult gibt die Anzahl der geschriebenen Daten zurück
  3. glGetQueryObjectuiv(pFeedbackQuery, GL_QUERY_RESULT, @pQueryResult);
  4.  

erhalte ich den gleichen Wert, wie meine Anzahl im pVBOFeedback erhaltenen Vertices (also pVerticesCount), was mir sagt, dass alles geklappt hat und das Feedback die richtige Anzahl in mein VBO geschrieben hat... nur leider ist der VBO ganz leer, wenn ich mir die Daten darin anzeigen lasse und auch wenn ich ihn rendere ist auch nix damit...

>>>hier kommt jetzt der Verzweiflungsschrei mit auf die Knie fallen: WARRRUUUUUUMMMM? :shock:

Also echt, ich finde den Fehler nicht, hab mir Beispiele (halt C++ aber egal) angeschaut, hab mir sogar das offizielle Beispiel vom OpenGL SDK von NVidia angeschaut, hab neuen Grafiktreiber draufgeknallt, hab's mit vom System gesetzten Shader-Variablen probiert (z.b. "gl_Position")... nichts passiert. Muss n sch... kleiner Fehler sein den ich übersehe, bitte helft mir :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 07:33 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
*seufz* niemand der schon damit gearbeitet hat? Ich finde den Fehler echt nicht... :cry:

Ich hab gesehen, dass das "Lumina" die Transform-Feedback schon integriert hat in Zusammenhang mit Partikel-Systemen. Soviel ich erkennen konnte werden dort die nötigen Datan an den Vertex-Shader über Attribute übergeben (glVertexAttribPointer?), ist eine solche übergabe der Input-Werten eine nötige Voraussetzung damit es funktioniert? Mir geht es ja nur um das Auslesen der Daten über eine Varying-Variable... was ich wirklich nicht zum laufen bringe... die Kontrolle über die Anzahl der geschriebenen Primitive ist ok nur der VBO ist dann leer... :?:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 09:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was mir nur gerade aufgefallen ist.. Mappst du das VBO irgendwo oder ist pVBOFeedback zufällig nil?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich glaube die Variablen sind vom Namen her etwas untypisch gewählt. Das kleine p am Anfang sugerriert ein bisschen, dass es sich dabei um einen Pointer handelt. Was aber Aufgrund des Einsatzes schon nicht möglich ist.

Script: Hast du mal geschaut ob du einen OpenGL Fehler bekommst? Das kannst du mit glGetError überprüfen. Mit gluErrorString erhältst du für die Konstante auch einen passenden Text. Wenn bei der Konstante etwas anderes als 0 herraus kommt solltest du den Fehler durch häufigeres Abfragen auf einzelne Funktionen eingrenzen. Und mit Hilfe der Spezifikation kannst herrausfinden welche Gründe es haben kann, dass die ein oder andere Methode einen Fehler erzeugt.


Ich möchte es im übrigen auch nicht ausschließen, dass der Header evtl. noch einen Fehler enthalten kann. Ich habe diese Extension frei nach den Beschreibungen aus der Spezifikation übersetzt. Aber nie getestet, da ich weder eine GF8 habe noch das interesse/wissen an Shader Entwicklung vorhanden ist. Du bist meines Wissens nach der Erste der diese Erweiterungen aus dem Pascal Header einsetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 13:29 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
Zitat:
Was mir nur gerade aufgefallen ist.. Mappst du das VBO irgendwo oder ist pVBOFeedback zufällig nil?

Soviel ich verstanden habe (und Beispiele auch bestätigen) muss der VBO eben grade nicht gemapt werden. Das ganze Feedback der Daten aus dem Shader wird direkt via GPU in den Grafikspeicher geschrieben. Ich habe ihn anschliessend nur mal gemapt um auszulesen was drin steht, in meinem Fall nichts.

Zitat:
Ich glaube die Variablen sind vom Namen her etwas untypisch gewählt. Das kleine p am Anfang sugerriert ein bisschen, dass es sich dabei um einen Pointer handelt. Was aber Aufgrund des Einsatzes schon nicht möglich ist.

Das "p" am Anfang hat damit leider sicher nichts zu tun, das ist ein Präfix meiner Variablenbenennung mit anderer Bedeutung und es sind auch keine Pointer.

Zitat:
Hast du mal geschaut ob du einen OpenGL Fehler bekommst?

Ja, keine der Aufgerufenen Funktionen ruft einen Fehler hervor.

Zitat:
Ich möchte es im übrigen auch nicht ausschließen, dass der Header evtl. noch einen Fehler enthalten kann.

Ich habe bereits einen Fehler (glaub ich) gefunden und bei mir korrigiert, werde ihn dir noch mitteilen sobald ich zuhause bin. Ist aber in einer Feedback-Funktion, die ich im Beispiel oben grade nicht verwende.

Zitat:
Du bist meines Wissens nach der Erste der diese Erweiterungen aus dem Pascal Header einsetzt.

Argh :P Wieso immer ich, wieso braucht das niemand? Ist doch wahnsinnig praktisch :D


Wie gesagt kann ich über das Query-Objekt sehr klar kontrollieren, wieviele Werte in den VBO geschrieben wurden, diese Anzahl ist korrekt, nur der Wert der Vertices ist 0... das heisst für mich, alle Initialisierungsfunktionen sind korrekt, die Varying-Variable wurde erkannt etc. etc.

Ist Lumina in Delphi/Pascal geschrieben? Dort gibt es ja auch ein Tutorial, sagt mir, dass das Zeug eigentlich funktionieren würde... ich glaub der Unterschied ist der, dass die Daten dort per glVertexAttribPointer an eine Attribute Variable des Shaders übergeben werden... treibt sich eigentlich der "Vater" von Lumina auch irgendwo hier herum? :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 13:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Script hat geschrieben:
Zitat:
Du bist meines Wissens nach der Erste der diese Erweiterungen aus dem Pascal Header einsetzt.

Argh :P Wieso immer ich, wieso braucht das niemand? Ist doch wahnsinnig praktisch :D

Weil die Extension so wahnsinnig neu ist, dass sie lediglich auf Geforce 8 unterstützt wird. Und weil man das auch nur braucht, wenn man Daten wieder zurück lesen möchte. Im übrigen solltest du berücksichtigen, dass falls du solche eine Technik in deiner richtigen Anwendung einsetzt du keine sonderlich große Verbreitung erwarten solltest. Einfach, weil die NV Variante der Extension nur von NVidia benutzt wird und ATI meines wissens nach diese Extension (EXT variante) noch gar nicht unterstützt. Also technisch gesehen werden eher weniger Leute in der Lage sein die Anwendung zu benutzen.

Script hat geschrieben:
Wie gesagt kann ich über das Query-Objekt sehr klar kontrollieren, wieviele Werte in den VBO geschrieben wurden, diese Anzahl ist korrekt, nur der Wert der Vertices ist 0... das heisst für mich, alle Initialisierungsfunktionen sind korrekt, die Varying-Variable wurde erkannt etc. etc.

Stimmt dein Schader?

Im übrigen kannst du bei pFeedbackVaryings auch ohne Array arbeiten. Wenn du einen Pointer auf den entsprechenden Typen übergibst ist das das gleiche wie den Pointer auf das erste Element. Ist das Array eigentlich statisch oder dynamisch?

Script hat geschrieben:
Ist Lumina in Delphi/Pascal geschrieben? Dort gibt es ja auch ein Tutorial, sagt mir, dass das Zeug eigentlich funktionieren würde... ich glaub der Unterschied ist der, dass die Daten dort per glVertexAttribPointer an eine Attribute Variable des Shaders übergeben werden... treibt sich eigentlich der "Vater" von Lumina auch irgendwo hier herum? :D

Lumina ist C++ und unter LInux geschrieben, wenn ich mich nicht vvertue. Und ja. Der Macher ist hier ab und an unterwegs. Lumina Projektthema. Wobei ich es komisch finde, dass er das Thema noch nicht gesehen hat. Mal dezent drauf hinweisen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 14:25 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
Zitat:
Also technisch gesehen werden eher weniger Leute in der Lage sein die Anwendung zu benutzen.

Aye, bin ich mir bewusst, ich programmiere nur für mich selber :D

Zitat:
Stimmt dein Schader?

Den Shader siehst du im ersten Post von mir, es funktioniert allerdings auch nicht, wenn ich die Feedback-Variable im Shader zum testen so setze: aTest = vec4(20, 30, 40, 1);

Zitat:
Im übrigen kannst du bei pFeedbackVaryings auch ohne Array arbeiten. Wenn du einen Pointer auf den entsprechenden Typen übergibst ist das das gleiche wie den Pointer auf das erste Element. Ist das Array eigentlich statisch oder dynamisch?

Das Array ist statisch und ist ein Array, weil ich später mehrere Feedback-Variablen übergeben will, um Daten simultan aufzuzeichnen. Ich denke das Array wird korrekt übergeben, sonst würde die Funktion glTransformFeedbackVaryingsNV wohl einen Fehler verursachen.

Zitat:
Mal dezent drauf hinweisen.

Ich werde ihn mal anstubsen :P

Hmm, wie übergebe ich einem Shader, also einer Attribute-Variable davon korrekt ein Array mit Werten? Ich nehme an mit glVertexAttribPointer?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2008 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Shader: War nur ne Frage zum Sichergehen. Denn ich hab bisher nichts mit Shader gemacht. ;) Ist nur etwas wo meine Inuition mich in Richtung Shader/Varying stupsen würde. Passende Anzahl an Vertices kommt durch aber alle sind 0. Und Fehler treten auch keine auf.

Arrays. Frage ich weil bei einem dynamischen Array @pFeedbackVaryings nämlich falsch wäre. Da dynamische Arrays nur Pointer sind würde man so nicht die Adresse der Daten sondern der Variable übergeben. Dann muss man genauer angeben was man haben will. Allso @pFeedbackVaryings[0] für das erste Element. Bei statischen wäre das egal. Da die Daten direkt dort liegen wo die Variable anfängt.

glVertexAttribPointer: Wären zusätzliche Daten für jeden Vertex. Wie Position/Normale/Farbe. Für einen Shaderparamater müssten Uniforms besser geeignet sein. Die können von außen gesetzt werden. Sofern ich mich gerade nich voll vertue.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Solange die Anzahl der geschriebenen vertices bekannt ist kann man auf den querry verzichten (der zudem eine zwangssynkronisation auslöst wenn man dessen verfügbarkeit nicht abwartet) Solange man nur einen vertexshader benutzt ist die anzahl der geschriebenen vertices identisch mit den die gesendet wurden. (Limitiert durch die große des ziehl VBOs)

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 29, 2008 09:34 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
Zitat:
Solange die Anzahl der geschriebenen vertices bekannt ist kann man auf den querry verzichten (der zudem eine zwangssynkronisation auslöst wenn man dessen verfügbarkeit nicht abwartet) Solange man nur einen vertexshader benutzt ist die anzahl der geschriebenen vertices identisch mit den die gesendet wurden. (Limitiert durch die große des ziehl VBOs)


Ich habe den Query nur benutzt um zu testen ob auch wirklich was passiert und ich Feedback habe... leider sagt der Query dass soweit alles ok ist, trotzdem funktioniert es nicht und meine Werte bleiben alle 0.

Kannst du mir sagen, weshalb du in Lumina die Daten an den Shader für das Feedback deiner Partikel an eine Attribute Variable ("Position_In" oder so) mit glVertexAttribPointer übergibst und nicht mit glVertexPointer und dann den Input via gl_Vertex? Vielleicht verursacht das bei mir den Fehler... *langsam verzweifel*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 29, 2008 19:07 
Offline
DGL Member

Registriert: Mo Jul 14, 2008 22:07
Beiträge: 20
Arrrrgh, jetzt läufts! Das ist zwar super aber ich habe keine Ahnung wieso jetzt plötzlich :shock: Naja, soweit ja egal :P Vielen Dank für eure Hilfe!

@Lossy eX
Noch wegen dem eventuellen Header-Fehler, ich glaube bei dieser Funktion:

Code:
  1. TglTransformFeedbackAttribsNV = procedure(count: TGLsizei; const attribs: TGLint; bufferMode: TGLenum);


Sollte der 2. Parameter, "attribs" vom Typ "PGLint" sein, also:

Code:
  1. TglTransformFeedbackAttribsNV = procedure(count: TGLsizei; const attribs: PGLint; bufferMode: TGLenum);


Soweit ich aus der Spec schlau wurde (ist n Array von Integers)


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 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.011s | 14 Queries | GZIP : On ]