Effiziente Bikubische Filterung-code in GLSL?
Frage ich mich, ob jemand hat einen vollständigen, funktionierenden und effizienten code zu tun "Bikubisch" textur-Filterung in glsl. Es ist dies:
http://www.codeproject.com/Articles/236394/Bi-Cubic-and-Bi-Linear-Interpolation-with-GLSL
oder
https://github.com/visionworkbench/visionworkbench/blob/master/src/vw/GPU/Shaders/Interp/interpolation-bicubic.glsl
aber beide do 16 textur liest, wo nur 4 sind notwendig:
https://groups.google.com/forum/#!topic/comp.Grafik.api.opengl/kqrujgJfTxo
Jedoch die oben genannte Methode verwendet eine fehlende "kubisch" ()" - Funktion, ich weiß nicht, was er tun soll, und nimmt auch einen unerklärlichen "texscale" - parameter.
Gibt es auch die NVidia-version:
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter20.html
aber ich glaube, das nutzt CUDA, was ist spezifisch für NVidia-Karten. Ich brauche glsl.
Könnte ich wahrscheinlich Anschluss der nvidia version zu glsl, aber dachte, ich würde zuerst Fragen, um zu sehen, wenn jemand bereits eine komplette, funktionierende glsl bikubische shader.
- "aber beide do 16 textur liest, wo nur 4 sind notwendig:" dieser Beitrag wird Ihnen liegen. Die bikubische interpolation ist nicht zu tun, 4 Bilineare samples erstellen; das ist nur lineare Filterung in einem größeren Maßstab. Die bikubische interpolation erfordert dabei kubische interpolation der Werte, nicht die lineare interpolation. Und Sie können nicht tun, kubische interpolation durch eine Reihe von linearen Interpolationen. Es ist wie der Unterschied zwischen einer Bézier-Kurve und die Linien erstellt, indem die 4 Bézier-Punkte. Es ist nicht ganz dasselbe, oder?
- Shader gepostet, dass ich etwas wie texcoord = Kubikmeter(lerp(texcoord)), so ist es im Grunde die Anwendung von zusätzlichen Funktion auf der Oberseite der textur-Koordinaten-interpolation. Diese Art der Filterung können verwendet werden zum anpassen der Bildgröße.
- Sie irren sich; dokumentiert, wie in der GPUGems Kapitel 2 und unten geschrieben von JAre und Maf, es ist durchaus möglich, führen Sie "Bikubisch" lookup mit 4 lineare Interpolationen.
- Und Sie können nicht tun, kubische interpolation durch eine Reihe von linearen Interpolationen. Das ist technisch nicht korrekt, das, wie De Casteljau-Algorithmus funktioniert
- Die GPUGems Artikel ist nicht CUDA. Es ist entweder Cg oder HLSL.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich beschlossen, nehmen Sie eine minute, um zu Graben meine alte Perforce Aktivitäten gefunden und die fehlenden Kubik () - Funktion, genießen Sie! 🙂
Fand ich diese Umsetzung, die verwendet werden können als drop-in Ersatz für die textur - () (aus http://www.java-gaming.org/index.php?topic=35123.0 (ein Tippfehler behoben)):
Beispiel: Nearest, bilinear, bicubic:
Die Bilddaten dieses Bild ist
Habe ich versucht zu reproduzieren (viele andere Interpolationsverfahren)
aber Sie haben eingespannt Polsterung, während ich die Wiederholung (Verpackung) Grenzen. Deshalb ist es nicht genau das gleiche.
Scheint das bikubische business ist nicht eine richtige interpolation, d.h. es braucht nicht auf die ursprünglichen Werte an den Punkten, wo die Daten definiert ist.
Die fehlende Funktion
cubic()
im JAre Antwort könnte wie folgt Aussehen:Es gibt die vier GEWICHTE für kubische B-Spline.
Es ist alles erklärt in NVidia Edelsteine.
Wow. Ich verstehe den code oben (kann ich nicht kommentieren w/reputation < 50) wie kam ich auf mit es im Frühjahr 2011. Das problem versuchte ich zu lösen war, betraf die alten IBM T42 (sorry, die genaue Modellnummer entgeht mir) laptop und ATI-Grafik-stack. Ich entwickelte den code auf der NV-Karte und ich ursprünglich verwendet, 16 texture-fetches. Das war ein bisschen langsam, aber schnell genug für meine Zwecke. Wenn jemand berichtet, es funktionierte nicht auf seinem laptop zeigte es sich, dass Sie nicht Unterstützung genug textur-fetches pro fragment. Ich hatte zu Ingenieur ein work-around und das beste, ich könnte kommen mit war, es zu tun mit der Anzahl von textur-fetches, die funktionieren würde.
Ich dachte so: okay, also wenn ich mit jedem quad (2x2) mit linearer filter das Verbleibende problem ist, können die Zeilen und Spalten, teilen sich die GEWICHTE? Das war das einzige problem in meinen Gedanken, wenn ich das Handwerk der code. Natürlich könnten Sie geteilt werden; die GEWICHTE sind die gleichen für jede Spalte und Zeile; perfekt!
Nun hatte ich vier Proben. Das Verbleibende problem war, wie Sie richtig zu kombinieren der Muster. Das war das größte Hindernis zu überwinden. Es dauerte etwa 10 Minuten, mit Bleistift und Papier. Mit zitternden Händen tippte ich den code und es hat funktioniert, schön. Dann lud ich die binaries der Kerl, der versprach, check it out auf seinen T42 (?) und er berichtete, dass es funktionierte. Das Ende. 🙂
Ich kann Ihnen versichern, dass die Gleichungen check-out und geben die mathematisch identische Ergebnisse zur Berechnung der Proben individuell. FYI: bei der CPU ist es schneller zu tun, horizontale und vertikale scan getrennt. Mit GPU mehreren Durchgängen nicht, die tolle Idee, vor allem, wenn es ist wahrscheinlich nicht machbar, jedenfalls in typischer Anwendungsfall.
Denkanstoß: ist es möglich, eine textur-lookup für den kubischen () - Funktion. Welche schneller ist hängt von der GPU, aber generell sind die sampler ist das Licht auf der ALU-Seite ist gerade dabei das arithmetische würde die Dinge auszugleichen. YMMV.
(EDIT)
Kubische() ist ein kubische spline-Funktion
Beispiel:
Quelle
Für Interessierte in GLSL-code zu tun tri-kubische interpolation, ray-casting code mit kubischer interpolation gefunden werden kann, die in den Beispielen/glCubicRayCast-Ordner:
http://www.dannyruijters.nl/cubicinterpolation/CI.zip
edit: Die kubische interpolation code ist jetzt auf github: CUDA version und WebGL version, und GLSL Probe.
Habe ich mit @Maf 's der kubische spline-Rezept für über ein Jahr, und ich empfehle es, wenn eine kubische B-spline Ihren Bedürfnissen entspricht.
Aber ich habe vor kurzem gemerkt, dass für meine Anwendung ist es wichtig, die Intensitäten entsprechen genau an der sample-Punkte. Also ich wechselte mit einem Catmull-Rom-spline, der verwendet ein etwas anderes Rezept-wie so:
Ich fand diese Koeffizienten, plus diejenigen, die für eine Reihe von anderen Geschmacksrichtungen von kubischen splines, die in der Vorlesung Noten:
http://www.cs.cmu.edu/afs/cs/academic/class/15462-s10/www/lec-slides/lec06.pdf
Ich denke, es ist möglich, dass die Catmull-version getan werden könnte, mit 4 textur-lookups, indem Sie (a) die Anordnung der Eingabe-textur, die wie ein Schachbrett mit alternativen slots gespeichert als positive und als negative, und (b) eine zugehörige Modifikation der textureBicubic. Das wäre angewiesen auf die Beiträge/GEWICHTE w.x/w.w immer negativ, und die Beiträge w.y/w.z immer positiv. Ich habe nicht überprüft, aber wenn das wahr ist, oder wie genau sich das geändert textureBicubic Aussehen würde.
... Ich habe überprüft, dass die w Beiträge erfüllen die +ve -ve Regeln.