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

1

05.10.2008, 17:08

Ein Mesh mit mehreren Shader rendern ?

hallo,

gibt es denn die Möglichkeit ein Mesh mit mehreren Shaders zu rendern ?
Das z.B. der erste Shader das Mesh normal rendert und ein zweiter Shader dann die Lichtberechnungen durchführt.

Ein sehr einfaches Beispiel, angenommen wir haben 2 Meshs, eines soll mit Licht (z.B. Directional Light) gerendert werden und das andere ohne Licht.
Muss man nun für jedes Mesh einen eigenen Shader schreiben oder gibt es die Möglichkeit einen Shader zu schreiben, bei dem man Licht ein/ab schalten kann ?

Bei der Transforming&Lightning Pipeline gab es ja auch die Möglichkeit ;-)

MfG,
cyby

Anonymous

unregistriert

2

05.10.2008, 17:22

Momente mal, nur damit ich das richtig verstehe: Du fragst vor ein paar Stunden wie man \ durch \\ ersetzt und hängst jetzt an Shadern?

Ich bitte dich, bevor du mit sowas anfängst, erst die grundlegenden Dinge einer Sprache zu lernen, bevor du die überüberüberüberübernächste Ebene erreichst.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

05.10.2008, 17:30

2 shader ist okay, das was du meinst geht auch, aber ist weggeworfenen rechenzeit, da du berechnungen durchüfhrst, die man auch weglassen könnte. wenn du unbedingt nur einen shader haben willst könnte das ekligerweise so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
float g_fUseLight; //wenn licht, ist das 1, sonst 0


//vertexshadermain, meinetwegen machst du per vertex diffuse:

vsout VSMain(vsin stIn)
{
    vsout stOut;

    //...

   
    stOut.vColor = saturate(dot(stIn.vNormal,vLightDir)) * float4(1.0f,1.0f,1.0f,1.0f) * g_fUseLight + float4(1.0f,1.0f,1.0f,1.0f) * (1.0f - g_fUseLight)
}


wenn du das auf 1 setzt wird der erste teil der summe <> 0, wenn du den wert für g_fUseLight auf 1 setzt, dann wird der erste summand 0 und der zweite weiss.

4

05.10.2008, 17:31

die Frage mit " \ durch \\ ersetzt" kam nur zustande, weil ich vor einiger zeit einen klasse zum laden von effekten geschrieben habe und es mir auf die nerven ging, immer \\ zu schreiben ;-)


edit:
ah danke für den Denk-Ansatz, dann könnte man das Problem theoretisch auch mit einer "if" Abfrage lösen ?
mit PS/VS 2_x wurde ja "if bool - ps" und "if bool - vs" eingeführt, um wahrscheinlich solche Probleme lösen zu können

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

05.10.2008, 20:04

Zitat von »"cyby"«

ah danke für den Denk-Ansatz, dann könnte man das Problem theoretisch auch mit einer "if" Abfrage lösen ?
mit PS/VS 2_x wurde ja "if bool - ps" und "if bool - vs" eingeführt, um wahrscheinlich solche Probleme lösen zu können


ja könnte man, nur is branching ziemlich teuer ;) (bei shadern) inwieweit aber hab ich mich auch nicht beschäftigt, bezogen auf den problem weiss vielleicht jemand anders rat.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

6

05.10.2008, 22:03

man kann auch einfach jedes submodel mit einem eigenen shader rendern. wenn du beispielsweise ein auto hast, würdest du die glasscheiben mit einem anderen shader rendern, als die reifen oder so... ;).

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

06.10.2008, 12:32

Zitat von »"Blacksnake"«

man kann auch einfach jedes submodel mit einem eigenen shader rendern. wenn du beispielsweise ein auto hast, würdest du die glasscheiben mit einem anderen shader rendern, als die reifen oder so... .


er meinte was anderes ;). er will das mesh zweimal rendern, einmal mit licht und einmal vorbeleuchtet.^^

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

8

06.10.2008, 13:47

geht das überhaupt? er müsste das objekt ja zweimal rendern, somit würde der alte renderstand, also der erste, verloren gehn, wenn man ihn nicht speichert. multi pass wäre ne lösung, ne andere wüsste ich jetzt nicht.
ich hoffe ich habe den absicht richtig verstanden ;)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

06.10.2008, 14:12

ja hast du, multipass ist auch eine idee, würde ich sogar favorisieren, spart effektwechsel.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

10

06.10.2008, 14:51

Aus deinem Thread geht nicht eindeutig hervor, ob du nun ein einziges Mesh mit zwei Shader rendern willst, wie im Titel beschrieben, oder zwei separate Meshes mit zwei separaten Shadern, wie du im Anfangspost beschreibst.

Das Problem der Permutationen, das dann weiter unten angesprochen wird, ist eine Sache die schon viele beschäftigt hat. Prinzipiell besteht bei Shadern die Möglichkeit, durch "Static Branching" mithilfe von Bool-Konstanten Codepfade pro Draw Call an/aus zu schalten, also so wie das auch in der FFP möglich ist/war. Prinzipiell deshalb, weil dies erst ab Shader Model 3.0 voll unterstütt wird - in Shader Model 2.0 gibt es das Feature dagegen nur im Vertex Shader.

Solltest du also mit Shader Model 2.0 und den entsprechenden Pixel Shadern arbeiten, wirst du um mehrere Shader-Permutationen nicht herum kommen, pro Licht- bzw. Nicht-Licht-Kombination ein separater Shader. Das Effekt-Framework kann dir dabei beschränkt unter die Arme greifen, indem es mehre Techniques / Passes unterstützt, die du zu diesem Zweck einsetzen kannst.

Ich arbeite zum Beispiel in meiner Engine unter Shader Model 2.0 mit 17 Permutationen für die Beleuchtung (3 Lichter und 3 Lichttypen vorsortiert in sämtlichen Kombinationen).

Um nun zu dem Problem zu kommen, mehrere Shader auf ein einziges Mesh anzuwenden, besteht wie bereits erwähnt nur die Möglichkeit der Multi-Pass-Variante. Das heißt, du renderst das Objekt zunächst normal mit dem ersten Shader, anschließend dann mit den entsprechenden Alpha Blending States (z.B. Additives Blending bei Beleuchtung) mit dem zweiten Shader und erhälst so ein Mesh, das mit beiden Shadern beleuchtet wurde. Auch diese Technik wende ich in meiner Engine an, wenn mehr als 3 Lichter auf ein Objekt einwirken.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Werbeanzeige