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

FSA

Community-Fossil

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

1

22.08.2014, 14:35

Instancing und verschiedene Materialien

Hallo! Mich würde mal interessieren, wie ihr Instancing im Zusammenhang mit mehreren Materialien gelöst habt. Ich habe mich gedanklich gerade sehr festgefahren und bräuchte ein Paar Denkanstöße.
Aktuell sieht mein Gedankenmodell so aus, dass ich entweder alle Materialdaten mit den InstancingDaten streame, das wären dann 84 Byte pro Material, oder ich einen ConstantBuffer einmal mit allen Daten vollpacke. Der würde dann so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
TEXTURE2D diff[512];

cbuffer AllMaterials
{
    float4 d[512];
    float4 a[512];
    ...
};

So müsste ich die Daten nur neu streamen, wenn ich an das Material 513 möchte. Aber ich glaube man sieht schon, dass ich mich festgefahren habe. Ich nehme alles an. Kleine Codeschnipsel aus euren Projekten, Ideen oder Links :thumbup:
Danke im Voraus.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

2

22.08.2014, 15:18

Warum festgefahren?
Die Idee mit den Materialiendaten in einem cb ist doch garnicht dumm. Im instancebuffer dann entsprechend noch die Material id mit unterbringen und voilà.

Eventuell für mehr Performance dann noch die Größe des streams reduzieren, indem du bspw im Voraus mithilfe von occlusion und anderen Methoden Materialien gruppierst und als unnötig markierst und somit verhinderst, dass unnötige Daten gestreamt werden
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »iSmokiieZz« (22.08.2014, 20:29) aus folgendem Grund: Id in den instancebuffer, nicht in den indexbuffer.


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

22.08.2014, 15:20

An wie viele verschiedene Materialien denkst du denn so?

FSA

Community-Fossil

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

4

22.08.2014, 16:14

Je nach Szene zwischen 400-900 Materialien.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

22.08.2014, 16:28

Je nach Szene zwischen 400-900 Materialien.


Dann passten die Infos sowieso nicht mehr in einen cbuffer. Bzw du kannst nicht mehr alle Infos während einem DC auswerten.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.08.2014, 19:22

Alle Materialien verwenden den selben Shader? In dem Fall könntest du die Materialien, wie du dir bereits überlegt hast, in einen cbuffer oder tbuffer packen und per Index drauf zugreifen...

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

22.08.2014, 21:13

Ehrlich gesagt finde ich das eine etwas seltsame Kombination.
Instancing ist dafür da das selbe Objekt mehrmals zu rendern. Eine große Anzahl an individuell gesetzten Materialien passt mir da irgendwie nicht dazu.

Abgesehen von dieser Situation zu der mir eigentlich kein sinnvoller Fall einfällt, würde ich auch einen Constant Buffer nehmen, wie es wohl im Dx Jargon heißt.
Allerdings wundere ich mich gerade was "d" und "a" enthält? Wenn "Diffuse" und "Ambient" und so weiter würde ich dir dringend raten ein anderes Materialsystem zu wählen was die Realität näher widerspiegelt. Damit meine ich zum Beispiel "Ambient" der Szene zuzuordnen und das eventuell folgende "Specular" und so weiter durch einen einfachen "Roughness"-Parameter versuchen zu ersetzen. "Diffuse" kann man möglicherweise auch mit der Textur oder der Vertexfarbe kombinieren. Damit spart man viel Speicher was mehr Platz im Buffer macht.

FSA

Community-Fossil

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

8

25.08.2014, 13:56

Eine große Anzahl an individuell gesetzten Materialien passt mir da irgendwie nicht dazu.

In meinem Anwendungsfall hat man mehrere Wände (gleiche Geometrie), aber verschiedene Texturen.

Ja ich arbeite gerade an einem anderen Materialsystem ;) Ich guck mir das ganze mal an und melde mich bei Problemen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

25.08.2014, 14:55

Ehrlich gesagt finde ich das eine etwas seltsame Kombination.
Instancing ist dafür da das selbe Objekt mehrmals zu rendern. Eine große Anzahl an individuell gesetzten Materialien passt mir da irgendwie nicht dazu.

Instancing ist dafür da, den selben Batch mehrmals zu renden. Eine große Anzahl an individuell gesetzten Materialien passt da – im Falle, dass es sich einfach um unterschiedliche Parameter für einen Shader handelt – perfekt dazu, genau dafür ist es gedacht... ;)

Werbeanzeige