Anforderung Materials

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Anforderung Materials

Beitrag von xq »

Hey!

Ich bastel grade an dem Material-System meiner Engine und bin am Überlegen, wie ich denn die Materials am besten implementiere. Ein Material ist im Moment eine Klasse, welche zusätzliche Informationen zu Textur und Shader speichert.
Mein Rendering-System besteht aus drei Teilen: Shader, Textur und Material. Ich denke, die Trennung ist so ganz sinnvoll, da ich verschiedene Modelle mit dem gleichen Material rendern kann, ohne dass man einen festen Shader hat.
Meine Frage ist jetzt, welche Werte in einem Material gespeichert werden sollen. Welche Werte will man als Leveldesigner modifizieren können, ohne dass man überladen wird mit Einstell-Möglichkeiten?
Der aktuelle Plan sieht so aus:
Material:
- Emissive-Farbe + Skalar zum Verstärken
- Surface-Farbe zum Einfärben des Diffuse-/Specular-Lightings
- Specular Power zum Anpassend der Specular Reflections
- Flag für Transparenz mit Alpha-Blending
- Reflective-Farbe für Reflektionen (ScreenSpace oder Environment-Map)

Ist das zu viel? Zu wenig? Ist es sinnvoll, Diffuse-Farbe und Specular-Farbe auseinanderzuziehen?

Schreibt doch mal eure Meinung und Erfahrung mit anderen Material-Systemen, dann kann ich mir ein klares Bild davon machen.

Grüße
Felix
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Anforderung Materials

Beitrag von joeydee »

Warum festlegen?
Da ja nicht jeder Shader mit allen Einstellungen was anfangen kann, und auch nicht vorhergesehen werden kann welche Materialeinstellungen für künftige Shader-Experimente noch so benötigt werden... ich mache das deshalb so, dass der Shader in einer Art Material-Klasse "gepackt" ist, welche Default-Werte für alle nötigen Shaderkonstanten enthält/generiert, falls diese nicht explizit anders beschrieben werden (bei mir gibts zudem noch ein Stream-Pattern, welches der Renderer erstmal mit der Anordnung im aktuellen Vertexstream vergleicht, bevor er loslegt). Shader, Materialkonstanten und Default-Werte sind damit ein zusammengehöriger Block. Diese Klasse generisch anzulegen ermöglicht sogar, neue Materials und Shader zur Laufzeit zu definieren (z.B. nachladen).
Den Shader kann man ja immer noch als Eigenschaft dieser Klasse wechseln, wenn das unbedingt gewünscht ist; eher macht man aber eine neue Materialinstanz auf und definiert die Zusammenhänge sauber.

Das ist zumindest mein Ansatz, mit dem ich bisher zufrieden bin. Dass es da durchdachtere Architekturen gibt, will ich nicht ausschließen.
Du musst bedenken, Shader werden nicht nur zur möglichst fotorealistischen Darstellung von 3D-Objekten benutzt; innerhalb eines Projektes kann es Anforderungen geben wie GUI-2D-Rendering, generische Texturen auf Hardware erzeugen, 3D-Minimaps, Screenspace-Effekte... da sind deine Vorgaben oben für einen Shader in der Regel völlig unbrauchbar.

Damit erübrigt sich auch die Frage, ob Diffuse- und Specular-Farbe getrennt werden sollten. Wenn du einen Shader schreibst, der nur ein paar Highlights simulieren soll, kannst du das zusammenfassen oder sogar Specular einfach auf Weiß setzen. Wenn du nur metallische Farben willst, setzt du Specular auf die Texturfarbe und brauchst die Specular-Farbe selbst gar nicht. Wenn du z.B. Cubemaps für Glanzeffekte nutzt, oder eine Material-Map hast, brauchst du sowieso entsprechende Texturen als Input und keinen Vektor.
Ich habe z.B. einen Shader mit zwei Specular-Terms, den könnte ich mit deinem o.g. System gar nicht verwirklichen.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Anforderung Materials

Beitrag von xq »

Danke, du hast mich auf eine tolle Idee gebracht. Ist zwar total durchgeknallt, aber auch nützlich:

Per Reflection zur Laufzeit eine Shader-Klasse mit allen Shader-Uniforms zu erzeugen, welche als Getter/Setter gleich die richtigen Uniforms ändern. Theopraktisch sollte das recht gut umsetzbar sein, brauch ja blos
https://www.opengl.org/wiki/GLAPI/glProgramUniform
https://www.opengl.org/wiki/GLAPI/glGetUniform
und ein bisschen Analyse-Kram.

Das statische Shader-Interface sollte ja trotzdem bestehen bleiben. Mal schauen, was sich daraus basteln lässt.
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

[Gelöst] Anforderung Materials

Beitrag von xq »

So, ich hab das Problem jetzt gelöst. Ich habe jetzt ein Basis-Material, welches für die Standard-Shader eine Implementierung der Material-Variablen enthält. Zudem kann der Renderer, das Mesh und beliebige weitere Elemente Shader-Uniforms liefern.

Grüße
Felix

PS.: Topic kann geschlossen werden
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Antworten