Kontur um das Mesh - "lichthof :-)"

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Kontur um das Mesh - "lichthof :-)"

Beitrag von DomiOh »

Hallo,

hat von euch schon mal jemand "Left 4 Dead" gespielt?
Man sieht dort die Restenergie der Mitspieler durch so eine Kontur um den Spieler oder zu benutzende Objekte durch eine weiße/blaue Kontur um das Objekt.
Das Spiel selbst nennt den Effekt in Deutsch "Lichthof". Es scheint immer um den Rand des Objekts.

Kann sich jemand vorstellen, wie das realisiert wird?

Gruß,
Domi
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4259
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von Chromanoid »

evt. einfach das selbe etwas "verfettete" mesh mit invertierten normalen und einer bestimmten farbe rendern... so hat man das jedenfalls früher gemacht :) weiß nicht ob das immer noch so ist :)
ansonsten schau dir mal bei http://developer.nvidia.com/object/fxc_ ... jects.html die samples an... aber hier sind sicher viele die da noch mehr rat wissen als ich :D
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von Jörg »

Alternativ kann man das alles ueber ein paar Filter-Operationen in 2D erledigen. Z.B. via Stencil (oder ID-Buffer) beim normalen Rendern das Objekt maskieren, und dann Blur/Dilatation/Was-weiss-ich-noch basierend auf dieser Maske ausfuehren.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4259
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von Chromanoid »

ich denke, dass die sowas in der art machen. hab mir nochmal gedanken gemacht und bei left4dead ist ja nicht einfach ein cartoon-silhouette zu sehen sondern ein schein nur um die äußeren ränder des meshs.
Bild
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von DomiOh »

Diesen Effekt find ich echt ganz interessant und er würde zu einem Projekt passen, welches ich allerdings bisher nur in Gedanken umrissen habe.
Mal sehen ob ich dazu noch mehr finde :-)
Danke für die Antworten.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von eXile »

Sieht für mich ganz klar nach einer Dilation und einem (separierbarem) Blur aus.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von DomiOh »

Ähem... geht das auch ohne Fachbegriff? Was ist eine Dilation? Blur, ja ok, aber inwiefern separierbar?
joggel

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von joggel »

Also, ich gebe auch mal eine Vermutung ab.
Ist nur ne Idee!


1.) Mesh der "umrandet" werden soll, mittels aktueller Projektsionsmatrix auf einer separaten Fläche rendern
==> es gibt nun ein "Bild" auf der nur dieser Mesh ist
2.) Konturen bestimmen bzw. nur Konturen auf separates Bild zeichnen
3.) bei der finalen Renderung dieses separates Konturen-Bild an entsprechender Stelle zeichnen.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4259
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von Chromanoid »

Bezügl. Dilitation -> Fachjargon aus dem Bereich Bildverarbeitung http://de.wikipedia.org/wiki/Dilatation ... arbeitung)
Ich bin mir aber nicht sicher ob diese Operation auf der Grafikkarte nicht zu zeitaufwendig (müsste man nicht pro pixel Konturdicke min. einen Pass machen?)...

http://www.flipcode.com/archives/Object_Outlining.shtml ist auch ganz interessant.

vielleicht machen die tatsächlich einfach eine silhouetten-erkennung und rendern die silhouette mit quads in einen buffer der über allen objekten liegt.

am anfang dieses videos http://www.youtube.com/watch?v=VVIdHPG0wYI sieht man aber, dass wahrscheinlich wirklich einfach alle meshes die mit kontur sein sollen in einfarbig gerendert werden (entweder schon an den normalen lokal vergrößert oder dannach eine dilitation). danach wird dann wahrscheinlich einfach ein blur drüber gemacht und das echte mesh wird wieder abgezogen.
also echte meshs in fläche rendern, je nachdem was schneller ist, in eine weitere fläche mit an normalen lokal vergrößerte meshs rendern (einfarbig) oder dilitation auf einfarbig gemachte kopie der erstgenannten fläche, dann blur drüber und alles was in der ersten fläche mit pixeln belegt ist bei der geblurten fläche entfernen.
so in der art:
outline.jpg
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Kontur um das Mesh - "lichthof :-)"

Beitrag von eXile »

Sorry, dass ich hier bzgl. der Dilatation (deutsch) aka Dilation (englisch) Verwirrung gestiftet hatte. Aber Chromanoid hat das alles richtig erklärt ;). Meiner bescheidenen Meinung nach geht die Dilatation (fast) beliebiger Größe ohne Probleme im Pixel-Shader, und zwar mit zwei verschachtelten for-Schleifen in Größe des zweiten Parameters der Dilatation (dieses wird im Wikipedia-Artikel auch strukturierendes Element genannt). In dieser Schleife überprüft man dann einfach, ob an der aktuell betrachteten Stelle in der Quelltextur ein Pixel gesetzt ist, und falls ja, gibt man sofort aus dem Pixel-Shader die gewünschte Farbe (z.B. Weiß) zurück (d.h. man kann direkt ein return machen). Sollte die Schleife durchlaufen, dann war eben kein Pixel unter dem betrachteten Ausschnitt gesetzt, und man gibt z.B. Schwarz zurück.

Damit sollte man, im Gegensatz zum Normalen-Extruden, eine sehr gleichmäßige Silhouette erhalten. Achja, man dilatiert natürlich mit der doppelten Größe des dann benutzten Glättungskernels, weil dann ja die Glättung direkt an der wirklichen Kante des Objektes aufhört ;)

Nachtrag: Zum separierbaren Blur. Das heißt einfach nur, dass man den Blur (der ja relativ groß ist) in X- und Y-Richtung aufteilen kann, und so von quadratischer Komplexität in einem Pass auf lineare Komplexität in zwei Passes kommt. Eigentlich werden große Blurs immer so berechnet :)
Antworten