Seite 1 von 1
[HLSL] Schildeffekt
Verfasst: 02.11.2010, 18:31
von Oromis_32
Hi,
ich habe gerade freudig meine ersten höherwertigen HLSL - Shader geschrieben und bin dann darauf gekommen, dass man Shader egtl. ganz einfach dazu nutzen könnte, eine Art "Schutzhülle" um ein Raumschiff zu rendern. Dazu müsste man ja die einzelnen Vertexpositionen in Richtung der Normalen "nach außen" schieben und das Modell dann halbtransparent rendern. Das habe ich dann auch gleich versucht, was zu diesem code geführt hat:
Code: Alles auswählen
BumpVertexShaderOutput HullVS(VS_INPUT Input)
{
BumpVertexShaderOutput Output; // Rückgabeveriable definieren
Output.Normal = float4(normalize(mul((float3) Input.Normal, (float3x3) mWorld)), 1.0); // Normalen umrechnen
Output.Tangent = float4(normalize(mul((float3) Input.Tangent, (float3x3) mWorld)), 1.0); // Tangenten (für Bump-Mapping, jetzt unwichtig)
Output.Binormal = float4(normalize(mul((float3) Input.Binormal, (float3x3) mWorld)), 1.0); // Bitangenten (für Bump-Mapping, jetzt unwichtig)
float4 vPos = mul(Input.Position, mWorld); // Position mit Weltmatrix transformieren
vPos += -Output.Normal * 0.1f; // Zentrale Stelle: Hier wird die Position um den Normalenvektor verschoben.... Problem siehe unten
Output.Position = mul(vPos, mViewProjection); // Mit Kamera- und Projektionsmatrix transformieren
Output.TexCoord = Input.TexCoord; // Durchkopieren
Output.WorldSpacePos = mul(Input.Position, mWorld); // Für Specular lighting Position an Pixelshader geben
return Output;
}
Das Problem dabei: Die Positionsdaten werden nicht wirklich entlang ihres Normalenvektors verschoben, sondern das Modell wird insgesamt hochskaliert, was ich mir nicht erklären kann und was nicht zum gewünschten Ergebnis führt.
die Zeile
hatte ich ursprünglich in der Form
was für mich logischer vorkam: Position + Richtung des Normalenvektors in der Länge 2 (Oder ein anderer Faktor),
das führt dann aber zu einem Modell, dass deutlich kleiner ist als das Original (es verschwindet darin und man sieht die Hülle nicht). Das kann ich nicht nachvollziehen
Ich wäre für eine Erklärung sehr dankbar
Gruß
David
Re: [HLSL] Schildeffekt
Verfasst: 02.11.2010, 18:33
von Aramis
Denke das Problem ist die vierte Koordinate der Normale. Ich wuerde die Verschiebung ausfuehren bevor ich das ganze in den Worldspace transformiere und auf homogene Koordinaten umsteige.
Re: [HLSL] Schildeffekt
Verfasst: 02.11.2010, 19:07
von Oromis_32
Yep, es war die vierte Komponente. So geht's:
Code: Alles auswählen
BumpVertexShaderOutput HullVS(VS_INPUT Input)
{
BumpVertexShaderOutput Output;
float3 vNormal = (float3) Input.Normal;
Input.Position.xyz += (normalize(vNormal)) * 7.0f;
Output.Normal = float4(normalize(mul((float3) Input.Normal, (float3x3) mWorld)), 1.0);
Output.Tangent = float4(normalize(mul((float3) Input.Tangent, (float3x3) mWorld)), 1.0);
Output.Binormal = float4(normalize(mul((float3) Input.Binormal, (float3x3) mWorld)), 1.0);
Output.Position = mul(Input.Position, mWorldViewProjection);
Output.TexCoord = Input.TexCoord;
Output.WorldSpacePos = mul(Input.Position, mWorld);
return Output;
}
Übrigens: Der Renderer läd Modelle von deinem Assimp, Aramis!
Und ich glaube behaupten zu können, dass die gerenderten Modelle die Qualität des Assimp-Viewers bei weitem übersteigen ;) Ich weiß schon, dass der Viewer nicht so sehr auf Qualität getrimmt ist, aber ich bin trotzdem zufrieden.
Danke nochmal für Assimp. Hat am Anfang gespackt ohne Ende, vor allem weil Rendering-Beispiele fehlen, aber nach einiger Zeit bin ich dahinter gekommen und jetzt bin ich sehr zufrieden :mrgreen:
Gruß
David
Re: [HLSL] Schildeffekt
Verfasst: 02.11.2010, 19:35
von Aramis
Freut mich zu hoeren. Vielleicht kannst du uns ja ein paar Screenshots posten :-)
Re: [HLSL] Schildeffekt
Verfasst: 02.11.2010, 21:13
von Oromis_32
Mach ich, aber erst, wenn ich die ganze Sache noch ein wenig weiterentwickelt und Animationen eingebaut habe.
Re: [HLSL] Schildeffekt
Verfasst: 02.11.2010, 23:52
von Matze
Oromis_32 hat geschrieben:Mach ich, aber erst, wenn ich die ganze Sache noch ein wenig weiterentwickelt und Animationen eingebaut habe.
Ich fänd es schön, wenn du dich vielleicht doch dazu durchringen könntest einen kleinen Screenshot von dem Effekt zu posten, auch wenn du daran noch nicht viel weiterentwickelt oder irgendwas animiert hast. Damit erreichst du drei Dinge:
- Andere Mitglieder, die vielleicht einen änhlichen Effekt suchen, können so besser beurteilen, ob deine Lösung für sie in Frage käme (denn ein Bild sagt immer noch mehr als tausend Worte).
- Du lädst andere Mitglieder zur Diskussion ein und erhälst vielleicht noch ein wenig mehr Feedback oder den ein oder anderen hilfreichen Tipp.
- Wenn du den Effekt weiterentwickelst und verfeinerst und zu jeder Stage ein Bild postest, ergibt das eine schöne Entwicklungschronologie.
Überleg es dir. Es ist selbstverständlich kein Zwang, aber wie gesagt, fänd ich es schön, einfach um der Community willen.
Re: [HLSL] Schildeffekt
Verfasst: 03.11.2010, 10:03
von Thoran
Ich unterstütze Matzes Vorschlag, zumal ich in einem Buch bei mir auch einen Shader drin hab, der einen Schildeffekt für Raumschiffe realisiert. Von daher würde mich ein Vergleich der Ergebnisse schon interessieren.
Thoran
Re: [HLSL] Schildeffekt
Verfasst: 03.11.2010, 21:31
von Oromis_32
OK, überredet ;) Ich stelle morgen mal was zusammen.
Re: [HLSL] Schildeffekt
Verfasst: 04.11.2010, 11:42
von Oromis_32
So here we go!
Das ist das "Grundschiff". Das Programm ist eine Art Sandbox, in der ich neue Features für das Spiel ausprobiere, das ich gerade entwickle.
Zur Info: Der Hintergrund ist eine Testskybox, die ich dazu nutze, mich immer im Raum orientieren zu können.
Das Schiff wird von einem Richtungslicht beleuchtet, Specular Lighting ist an, Bump Mapping aus (wg. fehlender Bumpmap für das Schiff).
So und jetzt der Hülleneffekt. Er beruht darauf, dass alle Vertizes um ihre Normalen nach außen verschoben werden. Mit diesem Effekt bin ich noch nicht ganz zufrieden, das dritte Bild zeigt warum: Bei manchen Vertizes kommt es vor, dass, wenn sie nach außen verschoben werden, die zugehörigen Dreiecke nicht mehr verbunden sind und so "Löcher" entstehen.
Für Fragen, Anregungen und Feedback stehe ich gern zur Verfügung
David
Re: [HLSL] Schildeffekt
Verfasst: 04.11.2010, 14:19
von Aramis
Jupp, sieht gut aus!
Hast du mal ueber dezentes Postprocessing nachgedacht? Z.b. ein leichter „Glow“-Effekt. Damit kaeme die Huelle evtl. noch besser raus.
Danke fuer's posten :-)
Re: [HLSL] Schildeffekt
Verfasst: 04.11.2010, 22:10
von Oromis_32
Joah einen Glow - Effekt wollte ich schon noch einbauen, aaaaber da stellt sich die Frage, wie ich das am besten mache.
Die einzige Möglichkeit, die mir bisher in den Sinn gekommen ist, ist ziemliche Recourcenverschwendung. Ich würde zuerst die Rückseiten des Modells ein wenig größer in der gewünschten Glühfarbe zeichnen und dann das eigentliche Modell darüber.
Da du aber grade schon mit dem Begriff "Postprocessing" um dich geworfen hast, muss es darüber ja auch eine Möglichkeit geben. Kannst du mir da mal auf die Sprünge helfen und das Prinzip erläutern?
Re: [HLSL] Schildeffekt
Verfasst: 04.11.2010, 22:17
von Aramis
Eigentlich ziemlich einfach.
Du renderst die ganze Szene nicht in den Backbuffer, sondern in ein Rendertarget der gleichen Groesse. Dann schwenkst du zurueck auf den Backbuffer, zeichnest ein bildschirmfuellendes Rechteck, dessen Pixelshader als Input u.a. das Rendertarget mit der Szene drin bekommt (ist dann eine ganz normale Textur). Mit der kannst du dann machen was du willst - z.B. grau einfaerben. Im einfachstmoeglichen Fall samplest du sie und reichst den Farbwert 1 zu 1 durch.
Fuer komplexere Effekte wie z.b. „Glow“ oder auch ein intensiver Weichzeichner („Blur“) wird die Textur mit der eigentlichen Szene drin meist sogar mehrfach vorbearbeitet. „Glow“ kann z.b. so aussehen (rtN steht jeweils fuer ein eigenes Rendertarget):
- Szene normal zeichnen in rt0
- Szene auf halbe Groesse runterskalieren, dabei von allen Farbwerten einen bestimmten Wert abziehen (sodass nur die hellen Teile erhalten bleiben). Ergebnis nach rt1.
- rt1 horizontal weichzeichnen, nach rt2.
- rt2 vertikal weichzeichnen, zurueck nach rt1.
- Dann der finale Durchgang: rt0 und rt2 addieren und in den Backbuffer hineinschreiben.
Wenn du es durchgehst stellst du fest dass dabei tatsaechlich die hellen Bereiche der Szene ueberstrahlen.
Re: [HLSL] Schildeffekt
Verfasst: 04.11.2010, 22:20
von Jörg
Die Löcher entstehen, wenn Du 2 Vertices hast, die zwar die gleiche Position aber verschiedene Normalen haben und kein (im Normalfall degeniertes) Dreieck existiert, welches zwischen beiden eine Kante aufweist. Durch einen Preprocessing-Step kannst Du das ja beheben, wenn es Dich stoert.
Re: [HLSL] Schildeffekt
Verfasst: 05.11.2010, 15:01
von Oromis_32
@Aramis: Danke, das werde ich mal ausprobieren, wenn ich mal Zeit habe.
@Jörg: Den Grund kannte ich schon, trotzdem danke für die Erklärung!
Re: [HLSL] Schildeffekt
Verfasst: 06.11.2010, 14:56
von Krishty
Du kannst für die DeckKraft auch einfach das Skalarprodukt zwischen Schildnormale und BetrachterRichtung (normalisiert!) nehmen, zwischen 0 und 1 einklemmen (saturate()) und mit einem Viertel potenzieren. Dann hast du was, was an Glow ziemlich nah rankommt und dabei um Dekaden schneller ist.