dieses Mal kein Problem, sondern einfach nur einen Shadercode den ich posten möchte.
Vielleicht kann ihn sich jemand noch einmal durchsehen, dann könnte er nämlich ins wiki.
Es handelt sich um einen Gauß-Shader. Die Standardabweichung lässt sich mittels uniform übergeben und die Größe der Filtermatrix lässt sich im Shader einstellen. (Vielleicht gibt es ja auch hier eine Möglichkeit diese zu übergeben)
Des weiteren muss noch die Texturgröße via width und height übergeben werden.
Vertex-Shader:
Code:
varying vec2 texCoord;
void main(void)
{
// Transformation (Modelview und Projection)
gl_Position = ftransform();
// Texturkoordinaten
gl_TexCoord[0] = gl_MultiTexCoord0;;
}
Fragment-Shader:
Code:
uniform sampler2D colorMap; // Textur
uniform float width;
uniform float height;
uniform float standardderivation;
const int kernelsize = 5;
// Um an die benachbarten Pixel zu kommen
const float step_w = 1.0/width;
const float step_h = 1.0/height;
// Konstanten
const float e = 2.71828;
const float pi = 3.14159;
// Gauß Matrix berechnen
void CalculateGaussMatrix(out int Matrix[kernelsize*kernelsize])
Sicherlich lässt sich da noch einiges optimieren, zumal die Gauß-Matrix hier ständig neu berechnet werden muss, vielleicht ließe sich dies auch irgendwie auf das Programm auslagern.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du das ding mal ausprobiert, so wegen performance und so?
So wie das aussieht, wird das seeehr langsam sein, weil er jeden Frame die Matrix neu berechnet, noch dazu haben wir hier kernelsize² Texturzugriffe, was auch nicht gerade harmlos ist...
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
Ja, sonderlich schnell ist es wirklich nicht und wirklich großflächige Blurs sind damit nicht möglich.
Ich habe irgendwo gelesen, dass man das Ganze allerdings stark optimieren kann, indem man erst Horizontal und dann Vertikal (oder umgekehrt) blurrt.
Wie stelle ich das an ?
(die Gauß Matrix werde ich dann wohl entweder statisch machen oder mir etwas anderes überlegen ^^)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, um erst horizontal und dann vertikal zu blurren, brauchst du entweder zwei Shader oder einen Shader mit einer If (nicht sehr gut auf älteren Karten), auf jeden Fall aber brauchst du zwei Renderpasses. So in der art:
Code:
1. Szene rendern
2. Framebuffer in eine Textur schreiben
3. Framebuffer leeren
4. Die Textur auf den ganzen Bildschirm mit dem 1. Shader rendern
5. Die Textur mit dem aktuellen Framebufferinhalt überschreiben
6. Die Textur erneut auf den ganzen Bildschirm rendern, diesmal mit dem 2. Shader
Welcher der beiden Shader jetzt horizontal und welcher vertikal blurrt, ist deine Entscheidung. Der Blur läuft ansonsten ganz normal ab, nur dass du anstatt kernelsize² "nur" kernelsize Texturzugriffe hast und der Shader auch auf älteren karten, wo die Schleife entrollt werden müsste, noch eine Chance hat durch den Maximal Instruction-Filter durchzukommen . Du musst halt anstatt einen Kreisförmigen Blur anzustellen nur nach oben und unten oder zur Seite gehen.
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
hi, das scheint in der Praxis ganz gut zu funktionieren. Ich nutze allerdings momentan eine Textur in die ich rendere. Lande aber gerade einmal bei 30fps, fast unabhängig von der Texturgröße, hat also vielleicht nichts mit dem Shader zu tun.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Es könnte daran liegen, dass dein Shader in Softwaremodus gehauen wird, wegen den vielen Texturzugriffen und instruktionen.
Und wenn du eine Textur nutzt, in die du renderst sehe ich gerade kein Problem, eine Horizontal/Vertikal Lösung zu verwenden oder reden wir da gerade aneinander vorbei?
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
Ich glaube garnicht, das wurde doch schon öfters gefragt, oder?
Auf jeden Fall dürfte es in der Performance doch was gebracht haben, dass du nicht in jedem Durchlauf die Gauß-Matrix berechnest. Das war sicher mit der größte Flaschenhals
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.