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

Aktuelle Zeit: Fr Jun 07, 2024 14:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 15, 2012 16:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hallöchen,

Ich benutze die Grafikkarte, um meine FFT-Daten nachzubereiten. Das ist eine 1024-Pixel breite 1D-Textur mit GL_LUMINANCE32F als Datentyp. Ich bilde den Durchschnitt über 255 Datenpunkte, die um dem aktuellen Punkt herum liegen, das ganze für alle 1024 Punkte. Warum läuft das immer noch flüssig? Das sind immer hin 255 Texturlookups. Oder werden 1D-Lookups mit nur einer Komponente irgendwie optimiert? Oder sind das einfach zu wenig Daten um im Softwaremodus signifikant langsamer zu sein (kann ich herausfinden, ob der Shader in Hardware läuft? Der Shaderlog spuckt keine Nachrichten aus).

Hier der Shadercode:
Code:
  1. uniform sampler1D fftData;
  2. uniform float fftAvgStep;
  3. varying float texCoord0x;
  4. const float fftdBLog = 3.321928094887362;
  5. const int halfCount = 127;
  6. const float halfCountf = float(halfCount);
  7. const float totalCount = float(halfCount) * 2. + 1.;
  8. const float avgDecay = sqrt(halfCountf / 2.0);
  9.  
  10. float sqr(float value)
  11. {
  12.     return value * value;
  13. }
  14.  
  15. void main(void)
  16. {
  17.     float p = texCoord0x;
  18.     float s = fftAvgStep;
  19.  
  20.     float value = texture1D(fftData, p).r;
  21.  
  22.     float sum = value, sqsum = sum * sum, weightSum = 1.;
  23.     for (int i = -halfCount; i < 0; i++) {
  24.         float coord = p + s * float(i);
  25.         float weight = exp(-sqr(float(i-1)/halfCountf) * avgDecay) * step(0., coord);
  26.         float tmp = texture1D(fftData, coord).r * weight;
  27.         sqsum += tmp * tmp;
  28.         sum += tmp;
  29.         weightSum += weight;
  30.     }
  31.     for (int i = 1; i < halfCount; i++) {
  32.         float weight = exp(-sqr(float(i+1)/halfCountf) * avgDecay);
  33.         float tmp = texture1D(fftData, p + s * float(i)).r * weight;
  34.         sqsum += tmp * tmp;
  35.         sum += tmp;
  36.         weightSum += weight;
  37.     }
  38.    
  39.     float rms = sqrt(sqsum / weightSum);
  40.     gl_FragColor = vec4(value, rms, 0., 0.));
  41. }
  42.  


grüße

ps: Falls das wichtig sein sollte – geschrieben wird in ein FBO mit nur einem 1×1024 Pixel großen GL_RGBA16F Color Attachment (also kein Depth Attachment oder solche Späße)
pps: Wer sich über nicht verwendete Variablen wundert – ich habe ein wenig Code entfernt.

_________________
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  
BeitragVerfasst: Mi Feb 15, 2012 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du machst also 255*1024 Texturlookups, richtig?

Jetzt überlege mal wie viele Texturlookups du machst wenn du bei einer Auflösung von 1280x720 ein Fullscreenquad renderst.Des weiteren kann die Grafikkarte in deinem Fall den Texturcache nutzen. Ein Texturlookup aus dem Cache ist etwa doppelt so schnell wie aus dem normalen Speicher.
=> Deine Grafikkarte langweilt sich ;)

Zitat:
Oder werden 1D-Lookups mit nur einer Komponente irgendwie optimiert?

Nein, abgesehen von Caching-Effekten, weil die Texel nebeneinander liegen. (Bei einer 2D-Textur ist das ja nur entweder auf der X oder Y-Achse der Fall...aber nicht bei beiden)

Generell ist es aber bei Datentexturen sinnvoll (sofern es die Hardware erlaubt) ein TBO zu benutzen. Dann kannst du direkt mit Integer-Koordinaten auf die Textur zugreifen, du sparst dir die Float-Umwandlung und Interpolation zwischen den Texeln.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 15, 2012 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Coolcat hat geschrieben:
Generell ist es aber bei Datentexturen sinnvoll (sofern es die Hardware erlaubt) ein TBO zu benutzen. Dann kannst du direkt mit Integer-Koordinaten auf die Textur zugreifen, du sparst dir die Float-Umwandlung und Interpolation zwischen den Texeln.

Ja, würde ich gerne – aber ich bin auf eine GeForce 7600 beschränkt.
Das Caching erklärt das. Ich hatte früher halt mal nen Blur gebaut und bin schon bei 81 Lookups am Ende gewesen. Ich dachte, es gäbe nen Hardwarelimit was die Anzahl der Lookups betrifft.

greetings

_________________
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  
BeitragVerfasst: Mi Feb 15, 2012 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nein, die Anzahl der Texturen ist begrenzt, nicht die der Lookups. Bei deinem Blur-Shader hast du sicher 81 Lookups PRO Pixel gemacht....selbst bei 1024x768 Auflösung sind das deutlich mehr als das was du jetzt machst.

_________________
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 » Shader


Wer ist online?

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