Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

1

07.08.2006, 12:02

Post Processing Effects: Cartoon-Grafiken Teil 2

So, jetzt wollen wir den eigentlichen Shader erstellen, der benötigt wird, um den Cartoon-Effekt darzustellen. Ihr wedet sehen, das ist eigentlich recht einfach.
Im Grunde erstellen wir nur einen Edge Detection Filter, d.h wir suchen stellen, an denen Starke Kontraste vorhanden sind. Weil das RGB Farbsystem auf normalen Fließkommazahlen basiert ist auch kaum etwas einfacher, als den Farbunterschied zwischen zwei Pixeln zu berechnen: Wir substrahieren einfach den einen vom anderen. Wenn jetzt der Unterschied größer ist als ein gewisser Wert, dann haben wir eine scharfe Kante, die es einzufärben gilt.

Also wollen wir erstmal den Anfang des Shaders niederschreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TEXTURE Tex;

struct InVertex 
{
 float2 Texture  : TEXCOORD0;
};

sampler samp = sampler_state
{
 Texture=<Tex>;
 AdressU=Wrap;
 AdressV=Wrap;
 MipFilter=Linear;
 MinFilter=Linear;
 MagFilter=Linear;
};

Ich denke da muss ich weiter ncihts erklären ;) .
Dann kommt das eigentlcih interessante:

C-/C++-Quelltext

1
2
3
4
float4 main(InVertex In) : COLOR 
{
 float4 Black1;
 float4 Black2;

Das sind die Farbunterschiede senkrecht und waagerecht.

C-/C++-Quelltext

1
2
3
4
float4 Oben=  tex2D(samp, In.Texture+float2( 0.000, 0.001));
 float4 Unten= tex2D(samp, In.Texture+float2( 0.000,-0.001));
 float4 Rechts=tex2D(samp, In.Texture+float2( 0.001, 0.000));
 float4 Links= tex2D(samp, In.Texture+float2(-0.001, 0.000));

Jetzt sampeln wir das ganze jeweils ein bisschen verschoben um dann später den Kontrast zu berechnen.

C-/C++-Quelltext

1
2
Black1=(Oben-Unten);
 Black2=(Rechts-Links);

Wir berechnen den Kontrast...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if(Black1[0]+Black1[1]+Black1[2]>0.75)
  return float4(0, 0, 0, 0);
 else if(Black1[0]+Black1[1]+Black1[2]<-0.75)
  return float4(0, 0, 0, 0);
 else if(Black2[0]+Black2[1]+Black2[2]>0.75)
  return float4(0, 0, 0, 0);
 else if(Black2[0]+Black2[1]+Black2[2]<-0.75)
  return float4(0, 0, 0, 0);
 else 
  return tex2D(samp, In.Texture);
}

Wenn der Kontrast größer ist als 0.75, dann geben wir schwarz aus, sonst geben wir den normal gesamelten Pixel aus.
Jetzt müssen wir diesen Shader nurnoch (gemäß eines anderen Tutorials von mir) Compilieren und schon haben wir Cartoongrafik in Echtzeit!

Wenn ihr sehen wollt, wie das ganze danach aussehen sollte:
http://rapidshare.de/files/28517444/release.rar.html
Bei Fehlern postet bitte die "Protokoll.txt".
Gesteuert wird mit den Pfeiltasten.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

07.08.2006, 12:13

Das Beispielprogram lässt sich bei mir nicht starten.
Außerdem noch ne Frage zum Shader. Was ist wenn man eine Textur hat, die starke Farbunterschiede hat. Dann geht das Konzept ja wohl nicht auf und es werden Kanten gezeichnet wo keine sind.
Für mich als Anfänger in Sachen Shader ist auch der Sampler nicht ganz verständlich. Was bedeuten "AdressU" und "AdrressV" ?

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

3

07.08.2006, 12:14

bei mir schmiert dein Programm ab, brauche ich irgendwas zusätzlich?
Was es alles gibt, das ich nich brauche - Aristoteles

Phili

unregistriert

4

07.08.2006, 12:42

@CW_COVOK
Naja, Shader Model 2.0 wär ganz praktisch.
Ich glaub aber ich hab auch sonst noch nen paar Fehler in der Initialisierung. Anders kann ich mir das nciht erklären. Die Engine, die Es verwendet ist ach noch nciht ganz ausgereift. Ich lösche denk ich vorerst mal den Link. [/url]

Phili

unregistriert

5

07.08.2006, 12:45

@Wümpftlbrümpftl
Das ist wahr, allerdings kann das durchaus auch erwünscht sein.
Das mit dem AdressU bezieht sich darauf, was passieren soll, wenn die Texturkoordinaten größer als 1 oder klaeibner als 0 sind und sagen aus, ob die Textur dann gekachelt, gespiegelt ... wir.

Phili

unregistriert

6

07.08.2006, 13:40

ok, hab jetzt ne neue Version hochgeladen. Wenn bei der auch Fehler auftreten, postet bitte die "Protokoll.txt".

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

7

07.08.2006, 15:10

Zitat


Engine wird gestartet
Present Parameters:
Aufloesung: 1024*768
Menge der BackBuffer: 2
BackBufferFormat: 22
Stencil Format: 75
Multisampling: 4
Engine wurde gestartet
ZBufer fuer Post Processing konnte nicht erstellt werden


das steht im Protokoll
Was es alles gibt, das ich nich brauche - Aristoteles

Phili

unregistriert

8

07.08.2006, 15:14

@CW_Kovok
Danke, ich schätz das Problem hab ich schnell gelöst...
Ok, hab das Problem warscheinlich gelöst. Neue Datei steht zum Download bereit.

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

9

07.08.2006, 15:27

jetzt funktionierts, nur soll das Auto nur von oben sichtbar sein, man sieht nich viel. Außerdem wäre es schön einmal zwischen mit und ohne effekt werchseln zu können, damit man die unterschiede erkennt
Was es alles gibt, das ich nich brauche - Aristoteles

Phili

unregistriert

10

07.08.2006, 15:30

@CW_Kovok
Pfeiltasten können wunder wirken ;)

Werbeanzeige