Ich arbeite derzeit an einem 2D-Spiel und meine aktuelle Aufgabe ist es, ausgewählte Objekte zu skizzieren.
Ich benutze grundsätzlich einen Blur Shader, um es vollständig zur Laufzeit zu machen. Ich zeichne mein Sprite zuerst mit einem vertikalen Gaußschen Unschärfeshader, dann zeichne ich es mit einem horizontalen Gaußschen Unschärfeshader und dann zeichne ich mein Sprite normal.
Hier ist mein Blur Shader: Sampler TextureSampler: register (s0);
#define SAMPLE_COUNT 15
float2 SampleOffsets[SAMPLE_COUNT];
float SampleWeights[SAMPLE_COUNT];
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c = 0;
// Combine a number of weighted image filter taps.
for (int i = 0; i < SAMPLE_COUNT; i++)
{
c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
}
return c;
}
SampleOffets sind die Offsets, mit denen ich Rundungspixel testen kann. SampleWeights sind Gewichte, die mit der Gaußschen Funktion berechnet werden ( http://en.wikipedia.org/wiki/Gaussian_blur ).
Hier ist das Ergebnis:
Es ist nicht so schlimm, ziemlich glatt, aber im Spiel nicht genug sichtbar ... Aber ich möchte in der Lage sein, die Dicke zu kontrollieren (um sie zu vergrößern) und einen ersten undurchsichtigen Umriss hinzuzufügen, bevor ich sie in Alpha einblende (um sie zu machen) es sichtbarer). Und ich habe das Gefühl, dass Gaußsche Unschärfe vielleicht nicht so gut ist, wie ich für meine Aufgabe gedacht habe :)
Eine andere Idee ist es, es automatisch aus der PNG-Datei zu generieren (mit einem Photoshop-Skript, um es automatisch zu machen). Ich muss nur die Umrisspixel mit einer benutzerdefinierten Farbe füllen, den Alpha-Wert beispielsweise in der roten Komponente speichern und alle anderen Komponenten auf 0 setzen. Dann muss ich nur einen Shader anwenden, der transparente Pixel durch die gewünschte Farbe ersetzt
float4 PixelShaderFunction2(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 color = tex2D(TextureSampler, texCoord);
float4 newColor = 0;
if (color.a == 0 && color.r != 0)
{
color.a = color.r;
// Blue outline
color.b = 1;
}
}
Das Problem ist, dass ich für mein Sprite die DXT5-Komprimierung verwende. Daher kann ich nicht sicher sein, ob die Farbe, die ich in meinem Shader bekomme, genau die gleiche ist, die ich geschrieben habe. Deshalb habe ich es nicht einmal versucht ... Irgendwelche Gedanken?
Jeder Rat wäre willkommen :)