[HLSL] Schildeffekt

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

[HLSL] Schildeffekt

Beitrag 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

Code: Alles auswählen

vPos += -Output.Normal * 0.1f;
hatte ich ursprünglich in der Form

Code: Alles auswählen

vPos += Output.Normal * 2.0f;
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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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.
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag von Aramis »

Freut mich zu hoeren. Vielleicht kannst du uns ja ein paar Screenshots posten :-)
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag von Oromis_32 »

Mach ich, aber erst, wenn ich die ganze Sache noch ein wenig weiterentwickelt und Animationen eingebaut habe.
Matze
Moderator
Beiträge: 107
Registriert: 26.02.2009, 18:28

Re: [HLSL] Schildeffekt

Beitrag 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.
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag von Oromis_32 »

OK, überredet ;) Ich stelle morgen mal was zusammen.
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag von Oromis_32 »

So here we go!
Cobra_Norm#1.jpg
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).
Cobra_Norm#2.jpg
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.
Cobra_Hull#1.jpg
Cobra_Hull#2.jpg
Cobra_Hull#3.jpg
Für Fragen, Anregungen und Feedback stehe ich gern zur Verfügung

David
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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 :-)
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag 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?
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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.
Oromis_32
Beiträge: 19
Registriert: 08.09.2010, 14:06
Echter Name: David Bauske

Re: [HLSL] Schildeffekt

Beitrag 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!
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [HLSL] Schildeffekt

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten