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

25.12.2003, 00:43

Shaderprogramme

Ich plannee grad an einer Engine und bin auch schon recht weit. Allerdings stecke ich grad an der Lighting Engine fest. Ich weis nicht wie ich das genau machen soll.
Also ich will die Lighting Engine ueber die Shader machen. Wenn moeglich PixelShader oder wenn nicht meglich oder der User es anders wuenscht ueber VertexShader. An sich ja kein Problem. Aber wenn der User nun ein Modell beleuchtet haben will und das Modell auch den VertexShader benutzt hab ich ja zwei Programme. Einmal fuer das Modell und einmal fuer die Lighting Engine.

Die Frage ist nun wie genau mach ich das jetzt, wenn die Lighting Engine den VertexShader nutzt?

Oder wie macht man es generell wenn man ein Modell mit mehreren Programmen laufen lassen will. Ich mein es kann ja immer nur ein Programm aktiv sein.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.12.2003, 08:08

Ja, dieses Problem hatte ich auch schonmal entdeckt, und habe dann in der Direct3D-Newsgroup vorgeschlagen, mehrere Vertex- und Pixel-Shader setzen zu können (praktisch gestaffelt, sodass sie hintereinander ausgeführt werden). Aber die meinten, man solle die neue High-Level-Shader-Language benutzen und einfach die Teile der Shader mit #include einbinden.

3

25.12.2003, 20:42

aehh...*g*....auch nicht schlecht. Nur sind z.B. Lighting Engine und Modell zwei getrennte Systeme. Wenn ich das richtig verstehe muest ich also meinen Shader Code fuer die Lighting Engine offen legen, damit die anderen den Code einfuegen koennen.

Kann man die Height Level Language nicht auch on the fly Kompilieren? Dann wuerde es ja gehen. Die Programmierer schreiben dann ihr Programm und ich haenge dann den Code fuer die Lighting Engine hinten drann und Kompiliere dann das ganze...hmmmm....das ist ja doof.

Oder ich lass sozusagen die Lighting Engine weg und sag den Leuten wenn ihr meine Lighting Engine benutzen wollt fuegt diesen Code hier in euren Shader Code eine. *rrr*
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.12.2003, 20:43

Man kann die Programme in Echtzeit kompilieren!
Dafür gibt es ID3DXEffectCompiler.

5

25.12.2003, 20:48

Hatte im Kopf das es sowas gibt. Wuste es aber nicht mehr genau. Das waehre ja dann recht Praktisch. Naja...das wird sich dann noch heraus stellen *G*. Dann werd ich es mal so Plannen das die Lighting Engine inntern direkt die Programme Kompiliert, wenn noetig. Da man die Shaderprogramme eh in meinem Script schreiben soll, ist es auch nicht das Problem den Code zu bekommen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

26.12.2003, 04:15

Also ich habe mir das ganze nochmal durch den Kopf gehen lassen. Ist ja nicht so einfach, vor allem hat sich mir ein neues Problem aufgetahn.

Ein Beispiel:
Ich habe einen Gang mit 5 Lichtern an der Decke. Nun geht der Spieler durch den Gang und wird einmal nur von einem Deckenlicht beleuchtet und spaeter dann von 2 oder vieleicht auch 3en. Jetzt gibt es ja die Shader Version 2.0 die mit Schleifen Arbeiten kann. Aber ich z.B. habe ja nur eine GF3 TI. Die hat aber nur Version 1.1, also keine Schleifen. Wie bekomm ich es denn so hin das er auch mit mehreren Lichtern klar kommt.
Mir faelt da nur eine gute Loesung ein. Und die lautet das ich das Objekt mehr mals Render. Halt so oft bis alle Lichter abgearbeitet wurden. Die andere Loesung die mir einfaelt das ich mehrere Programme schreibe. Halt eins fuer 1 Licht, eins fuer 2 Lichter und so weiter. Ist aber totaler muel.

Meine Lighting Engine wird sehr Flexibel sein. Und in einer Scene soll es auch moeglich sein sowohl Per Vertex Lighting also auch Per Pixel Lighting. Hab mir da was nettes ausgedacht. Das einzige was mir halt noch Kopfzerbrechen macht ist, wie bekomm ich mehrere Programme zusammen?
Also wie es scheint gibt es nur die Moeglichkeit das ich meinen Shader Code fuer die Licht Engine in zwei Formen Programmiere. Denn es wird ja nicht jedes Modell Shader verwenden. Die eine laeuft alleine und die andere Version wird dann spaeter in den Code der anderen Shader Codes eingefuegt und dann waehrend der Laufzeit Kompiliert.

Also ich hoffe es hat noch jemand ein paar nette Idenn zu diesem Thema.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

17.04.2004, 00:30

afaik is das mehrmals übereinanderrendern der scene pro licht ( mit alphablending halt ) die gängige lösung für das problem.

8

17.04.2004, 01:39

Das ist in sofern die einzige Lösung wenn man voraussetzt, das man n Lichter verarbeiten will. Das mehrmalige Rendern führt aber zu Performanceverlusten. Sprich, man sollte das Multipassing-Verfahren möglichst meiden.

Daher gibt es noch eine mögliche Lösung für dieses Problem. Man begrenzt einfach die Anzahl der Lichter, die ein Objekt auf einmal beleuchten können. Ich denke es wird nicht weiter auffallen, wenn der Spieler bei obigen Beispiel nur mit max 3 Lichtern beleuchtet wird.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

17.04.2004, 08:09

Zitat von »"DragonMaster"«

Das ist in sofern die einzige Lösung wenn man voraussetzt, das man n Lichter verarbeiten will.

Unterstützen die neuesten Shader nicht auch so etwas wie Schleifen?
Dann könntest Du schreiben "for(int i = 0; i < AnzahlLichter; i++)". Ich glaube, das geht.

Anonymous

unregistriert

10

17.04.2004, 12:02

Zitat

Aber ich z.B. habe ja nur eine GF3 TI. Die hat aber nur Version 1.1,...

Also er meint bei älteren. Die "Lösung": Wenn du schon zur Optimierung zu Shadern greifst, dann musst du halt einsehen, dass Leute mit so alten Graka, da sie sowieso keine Chance hätten.

Zitat

Wer lesen kann ist klar im Vorteil

Das habe ich immer wieder von meinen Mathelehrer zu hören bekommen, wenn ich die Aufgabe mal wieder viel zu hastig gemacht habe und irgendwo ein wichtiges wort vergessen habe. ;D

Werbeanzeige