Hi, ich schreibe gerade an einem Shader der aus 2 Texturen den "Boden" einer Map zeichnet. Dabei gibt die eine Textur die Bodentextur an, in der anderen Textur sind dann 256*256 Große Texturen zusammengefasst die dann ausgelesen werden. Jetzt habe ich allerdings das Problem der Interpolation. Da es bei der einen Textur um genaue Werte gehat, darf keine Interpolation statt finden, allerdings sieht alles rechteckig aus, wenn ich als Textur Filter-Parameter GL_NEAREST eingebe, da mit der Manhattendistanz gerechnet wird. Habt ihr eine Lösung wie ich es nicht eckig hinbekomme, also alle umliegenden Pixel zu einem Punkt die Distanz 1 haben? Ich hatte auch auf die glsl-Funktion Round() gesetzt, allerdings zeigt mein Shader mir dann "Warning: global funktion round requires "Version#130" or later".
Vorausgesetzt ich verstehe dein Problem richtig, könntest du das so lösen:
Für einen Bildschirmpixel berechnest du die Position in seinem Viereck des Rasters. Wenn dein Raster entlang der Koordinatenachsen ausgerichtet ist, würde das für den Punkt (5.5,4.6) in Weltkoordinaten (0.5,0.6) ergeben. Also einfach der Nachkommateil. Die beiden Zahlen werden benutzt um zwischen den Texturen zu interpolieren. Dann ermittelst du die 4 Farben die der Pixel hätte, wenn er vollständig aus dem Material von jeweils einer Ecke wäre. D.h. du schaust was für ein Material an den Punkten (5,4), (5,5), (6,4) und (6,5) ist und benutzt dann die Werte als Index für die tatsächliche Textur. So wie du das warscheinlich jetzt schon machst. Der Unterschied kommt jetzt dadurch das du nicht nur einen Farbwert hast sondern alle 4 die den Pixel beeinflussen sollen. Dann musst du wie gesagt nur noch zwischen den Farben interpolieren. Wenn du die Farben von (5,4) und (6,4) mit dem Wert 0.5 interpolierst und das Paar (5,5) (6,5) mit den selben bekommst du wieder zwei Werte, die du das mit 0.6 interpolierst. Das Ergebnis wäre dann die entgültige Farbe für den Pixel.
Also im Prinzip werden nicht die Indizes interpoliert (was falsche Werte erzeugen würde, wie du schon erkannt hast), sondern die Farben.
Wenn du mit Texturkoordinaten rechnest, statt mit Raumkoordinten, solltest du die Koordinaten von den Indizes mit der Größe der Textur multiplizieren, dann auf eine Ganze Zahl runden und dann wieder mit der Größe dividieren, damit ein Koordinatenpaar aus zwei ganzen Zahlen immer genau auf einem Texel ist und umgedreht auf einem Texel auch immer nur ein Paar ist.
Außerdem kann man statt den vier umgebenden Punkten auch noch mehr nehmen, damit der Kantenverlauf glatter wird.
Ich hoffe mal das war einigermaßen verständlich ausgedrückt, sodass es dir auch hilft und dich nicht noch mehr verwirrt.
Hm, vielleicht hatte ich auch dein Problem falsch verstanden. Wolltest du weiche Übergänge von einem Bodenmaterial zum anderen oder einen scharfen Übergang mit abgerundetem Kantenverlauf?
Gibt es in Shadern keine Möglichkeit nur den Absolutteil einer Variablen zu nutzen? Also ein Trunc() entsprechendes Kommando? Das ist doch genau das, was du mit einem x := x - (x mod 1) machst, oder?
Und, um dir dein If zu sparen könntest du einfach, bevor du "rundest" die Variable um 0.5 erhöhen.
Hallo mori, ich habe da eine Diskussion gefunden: http://www.jmonkeyengine.com/forum/inde ... pic=9058.0 Deine Problemstellung habe ich leider nicht verstanden, weil ich mir kein Bild machen konnte. Aber zumindest runden ohne round und trunc wird dort erklärt. An sonsten freuen sich natürlich Besitzer einer neueren Grafikkarte, wenn du einen #version 130 Shader mit round und trunc verwendest.
EDIT: Da steht auch, dass der Datentyp int auf 16 Bit begrenzt sei. Das ist in neueren Shaderversionen auf 32 Bit erhöht worden, aber Vorsicht ist geboten wenn man einen float unbedacht in einen int wandelt.
Danke für die Antworten, werde warscheinlich zwei Shader schreiben, damit man auf neuen Grafikkarten auch die funktionen round etc. benutzen kann. Das casten auf Int hatte ich auch schon versucht, leider hatte es nicht funktioniert.
Mitglieder in diesem Forum: 0 Mitglieder und 14 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.