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

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

24.12.2013, 22:09

DirectX11 Mehrere Texturen an Shader übergeben

Hi,

ich beschäftige mich seit kurzer Zeit mit Directx11.
Ich bin im Moment dabei, ein kleines 2D Spiel zu programmieren.

Meine Frage:
Es ist ja möglich, an die Shader mehrere Texturen (ID3D11ShaderResourceView) zu übergeben.
Kann man das verwenden und dem Shader irgendwie mitteilen, für welchen Vertex er welche Texture benutzen soll?
Ich möchte mehrere texturierte Rechtecke zeichen.

Oder soll man immer nur eine Textur übergeben, und dann mit mehreren Draw-Aufrufen arbeiten?

Und noch eine Fragen:
Ich habe eine Textur, mit einem weißen Hintergrund. Wie kann ich dem Shader mitteilen, dass die Farbe Weiß als transparent gelten soll?
Ich weis nicht so recht, unter welchen Stichworten ich da suchen soll.



Gruß

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

2

25.12.2013, 00:39

Ja das kann man. Wird jedoch nur verwendet, wenn man dem Shader mehrere Versionen einer Textur übergeben will. Z.B.: Normal Map, Specular Map, usw.
In deinem Fall würde ich für jedes Rechteck einen Draw-Call machen, da es ja auch verschiedene Objekte sind.
Zur zweiten Frage: Mach den weißen Hintergrund doch einfach in einem Bildbearbeitungsprogramm Transparent.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.12.2013, 01:06

In deinem Fall würde ich für jedes Rechteck einen Draw-Call machen

Ein ganz schlechter Tipp.
Das ist tödlich für die Performance.

Für solche Probleme gibt es Textur-Atlanten.
Die Idee: Alle Texturen in eine große Textur packen und über die Texturkoordinaten den passenden Teilbereich auswählen.

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

4

25.12.2013, 09:26

Aber doch nicht für so ein simples Programm.
Er will doch nur ein paar Rechtecke darstellen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

25.12.2013, 09:43

Das wissen wir ja nicht wirklich.
Vielleicht sind die Rechtecke Tiles einer Tile-Map. Dann werden es schnell ein paar tausend.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

6

25.12.2013, 10:29

Hi,

ja, ich will tatsächlich eine Tilemap darstellen ;)

Ich war mir nur nicht sicher, ob es vielleicht doch nen Trick gibt, dass man nicht immer, wenn ne Tile ne andere Texture als der Vorgänger benutzt nen Drawcall machen muss.



Gruß

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

25.12.2013, 10:54

Vielleicht hast du es nicht gesehen, aber ich habe dir doch den "Trick" genannt.
Alle Texturen in eine große packen und über die Texturkoordinaten die passende auswählen.

-> Du kannst die komplette Map (oder den kompletten sichtbaren Teil davon) in einem Rutsch zeichnen.

8

25.12.2013, 11:07

Es geht auch viel einfacher: Texture Arrays. Tiles haben üblicherweise alle die gleichen Ausmaße (sonst geht es nicht); man erzeugt dann eine Ressource vom Typ Texture2DArray und füllt alle Texturen, die man braucht, hintereinander dort hinein. Wenn man den Vertex Buffer erzeugt, schreibt man in jedes Vertex (oder, wenn man fortgeschritten ist, in jedes Dreieck) einen Index rein.

Im Shader minimiert es sich zu textureArray[index].Sample() textureArray.Sample(sampler, float3(u, v, index)) und ist sauschnell. Außerdem ist man das hässliche Filterkantenproblem los weil die Texturen in einem Texture2DArray unabhängig voneinander gefiltert werden.

Ich benutze das z.B. um 300 verschiedene (aber gleich große) Texturen in einem Draw Call runterzuackern.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Krishty« (25.12.2013, 11:12)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

25.12.2013, 11:15

Wie groß kann so ein Texture-Array sein? Gibt es da verlässliche Grenzen?

10

25.12.2013, 11:18

Maximale Texturausmaße sind 16384×16384; maximale Array-Länge ist 2048. Beides zugleich kann man natürlich nicht schaffen; vorher erreicht man das generelle Ressource-Limit von min(max(128,0.25f * (amount of dedicated VRAM)), 2048 ) MiB. Aber ein paar hundert MiB Texturen in einem Draw Call zu schalten ist natürlich schon ziemlich mächtig.

Quelle: Resource Limits (Direct3D 11)

Werbeanzeige

Ähnliche Themen