Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das geht so direkt nicht, man kann nich von Aussen auf Werte innerhalb eines Shaders zurückgreifen. Wenn du Rückgabewerte eines Shaders ermitteln willst musst du diese mittels Shader in eine Textur schreiben lassen und diese dann so auslesen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde dir zum Auslesen auf jeden fall den Ortho-Modus empfehlen. Dann machst du 1x1 Pixel große Quads. Für jedes Quad solltest du dann die Werte angeben, die dein Shader berechnen soll. Die für die Berechnung gebrauchten Werte könnte man z.B. per Texturkoordinate, die du ja theoretisch nicht brauchst, übergeben. (glMultiTexCoord).
Die Lichtquellen könnte man entweder in Uniform-Matrizen packen oder in eine Textur. Nach möglichkeit solltest du aber die erste Methode verwenden, da du bei der zweiten sehr viele Texturzugriffe machen müsstest und in den Datentypen auch relativ eingeschränkt bist (0.0 .. 1.0).
Im Shader kannst du dann das ergebnis mit gl_FragColor ausgeben, der Pixel, der das Quad darstellt, enthält dann das ergebnis, welches du z.B. mit glReadPixels auslesen kannst.
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 network • my 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
Registriert: Sa Sep 29, 2007 18:43 Beiträge: 38 Wohnort: STR / BLN / LAU
Hallo elektrokrach,
ich bin selber intensiv mit GPGPU beschäftigt, und erledige jeglichen Datentransfer vom Applikationsspeicher zum Grafikkartenspeicher und zurück über Texturen (habe sehr viel Daten). Ich kann dir vielleicht helfen.
Was genau hast du denn vor?
Wichtig ist deine Datenmenge zum Shader für die Berechnung und vor allem die Menge, welche du zur Applikation zurücklesen möchtest.
MfG[/code]
_________________ Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....
Registriert: Sa Sep 29, 2007 18:43 Beiträge: 38 Wohnort: STR / BLN / LAU
Hallo, hört sich machbar an...
Fragen:
Zitat:
Also, ich habe einen Haufen Vertices (3 * GLfloat pro Vertex)]
Sind das deine Raumkoordinaten?
Die Berechnete Farbe soll dann für andere Vertizes immer wieder benutzt werden, habe ich das richtig verstanden?
Soll die Farbe dann auf der Grafikkarte verbleiben, oder willst du sie von der Applikation auf das Vertex anwenden?
Welche Grafikkarte hast du?
OpenGL Version?
Hast du Erfahrung mit:
1. FBO's + RTT(Render-To-Texture)?
2. Wahlfreien Zugriff in einem Shader auf Texel einer Textur?
MfG
_________________ Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....
Registriert: Sa Sep 29, 2007 18:43 Beiträge: 38 Wohnort: STR / BLN / LAU
ATI oder NVIDIA ist bei deinem Vorhaben vermutlich egal.
Es gibt auch die Möglichkeit, das du die endgültigen Farben im Grafikspeicher läßt und im Shader die Farbe zuordnest. Jeder Datentransfer zur Grafikkarte kostet Zeit.
Zuerst sollten wir deine OpenGL Version nach 2.0 Abfragen. Ich benutze dafür GLEW.
Ich programmiere allerdings mit C/C++, den Code müsstest du nach Delphi ändern.
Code:
//check if OpenGL 2.0 is supported
if (glewIsSupported("GL_VERSION_2_0"))
{
cout<<"OpenGL 2.0 is supported...\nGLSL is integrated in core...\n";
}
else
{
cout<<"OpenGL 2.0 not supported\n";
}
_________________ Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....
Registriert: Sa Sep 29, 2007 18:43 Beiträge: 38 Wohnort: STR / BLN / LAU
1. Ohne Fenster nix zu zeichnen
Code:
// init window management
glutInit ( &argc, argv );
glutCreateWindow("IPGPU");
2. Orthogonale Projektion,Viewport und Render-Textur einstellen Dein Viewport muss die gleichen Ausmaße wie deine Render-Textur haben. Du musst dazu wissen wie viel Farben entstehen.
Bsp:
Code:
glMatrixMode(GL_PROJECTION); // set up projection matrix
Du kannst mit einem fbo mehrere Speicherbereiche auf der Grafikkarte reservieren. GL_COLOR_ATTACHMENT0_EXT ist ein Speicherbereich, GL_COLOR_ATTACHMENT1_EXT währe dann der nächste, natürlich mit einer anderen Textur.
4. Zeichne ein Quad über den gesamten Viewport, wähle vorher deinen Speicherbereich zum Rendern ( wenn du mehr als einen reserviert hast )
Code:
//choose buffer/attachment point for drawing
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
Weise den Fragmenten über einen Shader versuchsweise verschiedene Farben zu, diese müssten dann im folgenden Schritt aus dem Memory gelesen werden. 5. Lesen des Speicherbereiches
Code:
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, renderTextureX_m, renderTextureY_m, Format, Datentyp_Deiner_Farben, Array_Im_Applikationsspeicher);
Das ist so ziemlich das Grundprinzip. Fehler inklusive...Bring das mal zum Laufen und melde dich dann...auch wenn es nicht läuft.
Kleiner Ausblick was noch kommt:
Deine Positionen und Farben für die Lichter packst du jeweils in eine Textur.
Die Texturen machst du im Shader zugänglich. Die Koordinaten der Positionen und Farben der Lichter, sollten mit den Koordinaten der dazugehörigen Farben in der Render-Textur übereinstimmen. Zum Beispiel enthält Koordinate (0;0) in der Positionstextur und der Lichtfarbentextur, genau die Werte um die entsprechende Farbe in der Render-Textur mit der gleichen Koordinate (0;0) zu berechnen. Dies ist einfach zu handhaben, aber nicht immer möglich...
_________________ Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.