Okay, dann beschreibe ich das nochmal genauer.
Also ich möchte gerne normales Textur-Blending mit einem Texture2D-Array erreichen.
Wenn man das normal macht hat man ja seine 3 Texturen mit den Weight-Werten und seine 3 Texturen.
Ich habe jetzt aus den 3 Texturen mit den Weight-Werten eine Textur gemacht, diese enthält in den xyz die dementsprechenden Weights, in der w Komponente liegen 3 Index-Werte die jeweils den Index angeben für den aus dem Texture2D-Array gesampled werden.
Beim normalen Blending ohne Texture2D-Array nutzt man ja einen einfachen Sample der Wert aus der Weight-Textur geholt. Dieser Wert ist ja dann bereits billinear oder wie auf immer bereits interpoliert, dadurch kommt es dazu das man keine harten Kanten bekommt. Mit den harten Kannten meine ich das die eine Textur nicht weich in die andere Textur übergeht, sondern das die geblendete Textur abbrubt aufhört. Das ist halt dem zu verschulden das ich bei meiner Version mit dem Texture2D-Array die Funktion Load nehme um den Wert aus der Textur zu holen, dabei gibt es ja logischerweise keine Interpolation.
So und jetzt kommen wir zu meinem Versuch das Teil zu lösen:
|
HLSL-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
float GetWeight(int id, float2 uv)
{
// ausrechnen mit welchen Werten wir interpolieren müssen
float2 f = frac(uv * 512.f); // 512 ist die Texturgröße
// Hier werden die Daten aus der Textur geladen
// Die Zeilen interpolieren
float oben = lerp(lerp(t0, t1, f.x), t3, f.x);
float mitte = lerp(lerp(l0, t2, f.x), tr, f.x);
float unten = lerp(lerp(l1, br, f.x), br, f.x);
return lerp(lerp(oben, mitte, f.y), unten, f.y);
}
|
So ich hoffe die Funktion ist verständlich, ist ein bisschen eingekürzt aber das wichtigste ist enthalten.
Wie man sieht berechne ich erst mit welchen Stärken in X-Richtung und Y-Richtung interpoliert werden soll.
Dann hole ich die 9 Werte aus der Textur, also einmal alle Werte um die momentane UV-Position und die momentane selbst.
Im letzten Schritt interpoliere ich erst in jede Zeile in X-Richtung mit sich selbst, danach werden dann noch alle in Y-Richtung interpoliert.
Und dieses Resultat wird dann zum blenden benutzt.
Ich hoffe das ist jetzt verständlicher.