Ich habe heute mal schnell einen Radial Blur Effekt erstellt. Da es da noch keinen in der Engine gibt, dachte ich, dass es vielleicht nützlich wäre den hier zu teilen. Das Feedback wäre wahrscheinlich auch gut für mich, um den Effekt zu verbessern.
Hier ein Bild vom Material:
[Blockierte Grafik: http://forum.unrealengine4.de/Attachment/26-RadialBlur-jpg/]
Der HLSL Code für den Custom Node:
float2 ScreenMult = View.ViewSizeAndSceneTexelSize.xy / View.RenderTargetSize;
int TexIndex = 14;
float samples[10] = {-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08};
float2 dir = ScreenMult * float2(0.5,0.5) - UV;
float4 color = SceneTextureLookup(UV, TexIndex, false);
float4 sum = color;
float2 pos = float2(0.0,0.0);
for(int i = 0; i<10; i++)
{
pos = UV + dir * samples[i] * sampleDist;
max(min(pos, SreenMult * float2(1.0, 1.0)), float2(0.0,0.0));
sum += SceneTextureLookup(pos, TexIndex, false);
}
sum *= 1.0/11.0;
return sum;
Alles anzeigen
Der samples array kann nach belieben verändert werden. Natürlich muss das limit in der for-schleife mit der Anzahl der Elemente überinstimmen. Eine Größere Anzahl und dichtere verteilung der Samples macht den Effekt Qualitatis besser, erhöht dafür natürlich die Anzahl der Rechenoperationen pro Pixel. Eine mögliche Verbesserung wäre es, den Code so zu gestalten, dass man die Anzahl an Samples und deren Auflösung wählen kann ohne den Code direkt zu verändern. Zur Zeit gibt es nur den Parameter sampleDist mit dem man das ganze skalieren kann. Würde natürlich heißen, dass der GPU mehr Rechenoperationen pro Frame leisten muss.
Ein paar Dinge darin sind noch eher Workarounds. Z.B. ist der SceneTexture Node nur da, damit die Funktion SceneTextureLookup funktioniert.
Im Anhang ist noch eine *.txt mit der sollte man über Copy&Paste das ganze auch einfach in den Material Editor hineinkopieren können.
Und zu aller letzt noch ein Screenshot vom Ergebnis:
[Blockierte Grafik: http://forum.unrealengine4.de/Attachment/28-RadialBlurScreen-jpg/]