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

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

1

07.06.2012, 11:44

Shaderklasse DirectX11: Eine pro Shader?

Hallo zusammen,
ich programmiere ja gerade eine Engine die auf DirectX11 aufbaut. Sie soll natürlich auch Shader unterstützen. Bei der Programmierung orientiere ich mich stark an den Tutorials von http://www.rastertek.com. Dort wird für jeden Shader ne eigene Klasse erstellt (im neusten Tutorial wird dann erklärt, wie man mehere Shader über nen Manager steuert).
Ich frage mich jedoch: Ist das wirklich nötig und sinnvoll? Schließlich schreibt man seine Shader in HLSL, welches dann zur Laufzeit kompiliert wird. Wenn ich also eh für jeden möglichen Shadereffekt ne eigene Shaderklasse brauche, wozu lager ich dann den eigentlichen Shadercode überhaupt aus? Ich ging eigentlich davon aus, dass ich durch das Auslagern weniger Schreibaufwand in C++ habe.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

07.06.2012, 11:47

Kommt mir gerade Spanisch vor. Ich habe natürlich nur eine Klasse für Shader die dann 2 maps mit den uniforms und buffern hat. Das ist zwar OpenGL aber ich kann mir nicht vor stellen das D3D da sehr viel anders ist.
Warum sollte man auch für jeden Shader eine eigene Klasse schreiben? Eine reicht ja um unendlich Instanzen daraus zu erstellen.

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

3

07.06.2012, 13:36

Kommt mir gerade Spanisch vor. Ich habe natürlich nur eine Klasse für Shader die dann 2 maps mit den uniforms und buffern hat. Das ist zwar OpenGL aber ich kann mir nicht vor stellen das D3D da sehr viel anders ist.
Warum sollte man auch für jeden Shader eine eigene Klasse schreiben? Eine reicht ja um unendlich Instanzen daraus zu erstellen.

Genau deswegen frag ich sicherheitshalber nach^^ Ich habe überhaupt keine Ahnung von Shadern (lerne es durch den Bau der Engine sozusagen)und habe keine Lust jetzt das alles zu programmieren nur um festzustellen, dass es unnötige Arbeit war.

Aber wenn das bei OpenGl nicht nötig ist, wird es in DirectX wohl auch nicht so sein. Danke für die Aufklärung^^

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

4

07.06.2012, 14:55

Meine Erfahrungen mit Havok Vision-Engine und deren DX11 Shadern hat mir gezeigt, das sich die Dx Shader doch deutlich von den OpenGL Shadern unterscheiden.
Daher würde ich diese Schlussfolgerung nicht so einfach ziehen.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

07.06.2012, 17:13

Ich frage mich jedoch: Ist das wirklich nötig und sinnvoll?


Kommt drauf an was du haben willst. Normal kann ein allgemeines Interface gefunden werden, um jeden möglichen Shader zu repräsentieren. Die Schnittstelle benötigt ja im Allgemeinen nicht mehr als eine Handvoll Funktionen um Parameter/Sampler zu setzen.
@D13_Dreinig

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

07.06.2012, 17:48

Ich weiß ja nicht wie das bei D3D ist aber meine Klasse hält halt nur die Informationen zum Shader, compiliert ihn und kann noch ein paar Sachen mehr. Aber alles ist gemein gehalten.
An deiner Stelle würde ich auch versuchen alles erstmal gemein zu halten und später kannst du dann falls nötig von der Klasse ableiten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

07.06.2012, 22:16

Ich frage mich jedoch: Ist das wirklich nötig und sinnvoll? Schließlich schreibt man seine Shader in HLSL, welches dann zur Laufzeit kompiliert wird. Wenn ich also eh für jeden möglichen Shadereffekt ne eigene Shaderklasse brauche, wozu lager ich dann den eigentlichen Shadercode überhaupt aus? Ich ging eigentlich davon aus, dass ich durch das Auslagern weniger Schreibaufwand in C++ habe.

Ich glaub du musst hier unterscheiden zwischen dem Shadercode der irgendwas auf der Grafikkarte macht (HLSL) und dem was dein Programm mit dem Shader anstellt (deine C++ Klasse)...

Warum sollte man auch für jeden Shader eine eigene Klasse schreiben? Eine reicht ja um unendlich Instanzen daraus zu erstellen.

Ist eben die Frage auf welcher Ebene man kapselt.

Genau deswegen frag ich sicherheitshalber nach^^ Ich habe überhaupt keine Ahnung von Shadern (lerne es durch den Bau der Engine sozusagen)und habe keine Lust jetzt das alles zu programmieren nur um festzustellen, dass es unnötige Arbeit war.

Genau aus dem Grund würde ich dir raten, das mit der Engine bleiben zu lassen und stattdessen ein Spiel zu schreiben. Dann hast du eine konkrete Anwendung für die du ein konkretes Design machen kannst. Ohne viel Erfahrung damit, wie genau man so ein Spiel eigentlich am besten aufbaut, ist es praktisch unmöglich, einfach so eine brauchbare Engine zu entwerfen. Daher besser viele Spiele bauen. Dabei wird dir auffallen dass du gewissen Code aus deinen früheren Spielen immer wieder verwenden kannst, vielleicht in etwas abgewandelter Form etc. Es wird sich völlig natürlich anfühlen, diesen Code zu generalisieren und zu verfeinern, sodass er in möglichst vielen verschiedenen Projekten eingesetzt werden kann. Auf diesem Weg konvergierst du langsam zu einer brauchbaren Library and Dingen, die du dann Engine nennen kannst wenn du willst...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (07.06.2012, 22:28)


Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

8

08.06.2012, 00:03


Genau aus dem Grund würde ich dir raten, das mit der Engine bleiben zu lassen und stattdessen ein Spiel zu schreiben. Dann hast du eine konkrete Anwendung für die du ein konkretes Design machen kannst. Ohne viel Erfahrung damit, wie genau man so ein Spiel eigentlich am besten aufbaut, ist es praktisch unmöglich, eine brauchbare Engine zu entwerfen. Daher besser viele Spiele bauen. Dabei wird dir auffallen dass du gewissen Code aus deinen früheren Spielen immer wieder verwenden kannst, vielleicht in etwas abgewandelter Form etc. Es wird sich völlig natürlich anfühlen, diesen Code zu generalisieren und zu verfeinern, sodass er in möglichst vielen verschiedenen Projekten eingesetzt werden kann. Auf diesem Weg konvergierst du langsam zu einer brauchbaren Library and Dingen, die du dann Engine nennen kannst wenn du willst...


Ich programmiere die Engine nicht blind keine Sorge^^ Ich habe ne kleine Testszene, wodurch ich sehen kann, ob die Features funktionieren und vor allem ob mir der Code gefällt, mit dem ich diese Szene darstelle oder nicht. Passt mir da etwas nicht, wird es in der Engine direkt passend gemacht. Natürlich ist eine Szene nicht ein komplettes Spiel, aber ich bin der Meinung, dass es reicht,weil:
- Ich habe bereits eine Vorstellung davon wie der Code der Anwendung aussehen soll, da ich bereits mit verschiedenen Engines programmiert habe (SDL,SFML,Irrlicht).
- Ich bin, wie ich finde bereits sehr weit mit der Engine (für Videos einfach den Link in der Signatur folgen).
- Ich habe bisher nicht das Gefühl gehabt, mit der Entwicklung wirklich "überfordert" zu sein. Klar einiges klappt nicht auf Anhieb und manchmal muss man in den sauren Apfel beißen, und einige Codezeilen umschreiben, aber das muss man immer, auch bei Spielen.

Danke euch allen für die guten Ratschläge und Hinweise^^.
Jetzt kann ich wenigstens ruhigen Gewissens erstmal bei der allgemeinen Shaderklasse bleiben, bis ich wirklich einen Grund sehe, das ganze zu kapseln.

Werbeanzeige