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

Aktuelle Zeit: So Jul 20, 2025 18:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Wie Daten aus Shader auslesen?
BeitragVerfasst: Mo Okt 29, 2007 15:39 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 29, 2007 15:41 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 30, 2007 17:07 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 04, 2007 16:55 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
lass ma


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 04, 2007 19:04 
Offline
DGL Member
Benutzeravatar

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 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: Mo Nov 05, 2007 15:34 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
Danke


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 05, 2007 16:05 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
2x2 , 3x3 oder 4x4


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 06, 2007 18:29 
Offline
DGL Member

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....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 06, 2007 21:01 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 09, 2007 20:15 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:22, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 18:41 
Offline
DGL Member

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....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 20:41 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
is eh wurscht


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:22, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 08:15 
Offline
DGL Member

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:
  1.  
  2. //check if OpenGL 2.0 is supported
  3. if (glewIsSupported("GL_VERSION_2_0"))
  4. {
  5.     cout<<"OpenGL 2.0 is supported...\nGLSL is integrated in core...\n";
  6. }
  7. else
  8. {
  9.     cout<<"OpenGL 2.0 not supported\n";
  10. }

_________________
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....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 15:05 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
egal


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:22, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 14, 2007 08:49 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
1. Ohne Fenster nix zu zeichnen
Code:
  1. // init window management
  2. glutInit ( &argc, argv );
  3. glutCreateWindow("IPGPU");
  4.  

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:
  1. glMatrixMode(GL_PROJECTION);                                       // set up projection matrix
  2. glLoadIdentity();
  3. gluOrtho2D(0.0, renderTextureX_m, 0.0, renderTextureY_m);   // 2d projection  
  4.    
  5. glMatrixMode(GL_MODELVIEW);                         // set up modelview matrix
  6. glLoadIdentity();
  7. glViewport(0, 0, renderTextureX_m, renderTextureY_m);   // size of viewport
  8.  


Code:
  1. //create render texture
  2. glGenTextures (1, &renderTexture_m);
  3. glBindTexture(TexTarget_m, renderTexture_m);
  4. // set up texture parameters, turn off filtering
  5. glTexParameteri(TexTarget_m, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  6. glTexParameteri(TexTarget_m, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  7. glTexParameteri(TexTarget_m, GL_TEXTURE_WRAP_S, GL_CLAMP);
  8. glTexParameteri(TexTarget_m, GL_TEXTURE_WRAP_T, GL_CLAMP);
  9. // define texture with same size like viewport
  10. glTexImage2D(TexTarget_m, 0, internes_Format , renderTextureX_m, renderTextureY_m, 0, Format, Datentyp_Deiner_Farben, 0);
  11. //use original values of texture (no mix with default color of quad)
  12. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  13.  


3.Offscreen-Memory mit FBO verwalten(nähere Infos siehe Tutorial)
Code:
  1. //generate valid handle to fbo
  2. glGenFramebuffersEXT(1, &Fbo_m);
  3. //bind fbo to skip screen as render target and use the frame buffer
  4. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, dwFbo_m);
  5. // attach texture to framebuffer(use texture/framebuffer as render target)
  6. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, TexTarget_m, renderTexture_m, 0);
  7.  

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:
  1. //choose buffer/attachment point for drawing
  2. glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
  3.  

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:
  1. glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
  2. 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....


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


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]