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

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

1

20.09.2012, 12:22

[OpenGL] Read/Write mit verschiedenen FBOs

Moin.

Ich will meine aktuelle Sprite-Verarbeitung umstellen auf einen Textur-Atlas und VBOs, sodass alle Sprites in "einem einzigen Call" gerendert werden können statt der im Moment noch alten Verwendung von glVertexArray & Co.
Das Problem stellen dabei die typischen Kandidaten dar, die aus dem Hintergrund-Puffer lesen müssen (z.B. Sprites mit Distortion-Effekten etc). Bisher war das so gelöst, dass ohnehin alle Sprites nach Ebenen sortiert einzeln gerendert wurden und solche Sprites mit speziellen Shader-Ansprüchen, welche auf dem Hintergrund basieren, ihren Bildinhalt nach dem Rendern in einen zweiten separaten Buffer kopiert haben, aus dem dann für die Effekte der nachfolgenden Sprites gelesen werden konnte. Sprich:
1) Alle normalen Sprites rendern
2) Hintergrund separat buffern
3) spezielles Sprite rendern - lesen aus Buffer+Textur -> schreiben in Backbuffer
4) Affected Region aus 3) vom Backbuffer in Buffer kopieren
5) Falls noch spezielle Sprites da, gehe zu 3)

Wenn ich jetzt alles in einem einzigen Pass/Call rendern will, dann sieht es mit dem Schritt (4) schlecht aus. Ich habe überlegt, ob man dafür zwei FBOs binden kann und gleichzeitig in beide schreibt. Allerdings weiß ich nun nicht, wie und ob es auch geht, dass ich in einem Shader auch entscheiden kann, dass ich nur aus dem einen lesen und in den anderen schreiben will. Sprich dass ich zwei Sprites rendere: Das erste liest aus Buffer1 und schreibt in Buffer2, das zweite liest aus Buffer2 und kopiert nach Buffer1. Ist das möglich und sinnvoll? Welche Alternativen seht ihr dabei? Eine weitere Unschönheit bei "alles in einem Call" wäre, dass ein einziger Shader alle Effekte bereitstellen müsste, man nicht einfach mal so neue Shader einhängen könnte oder ich die Render-Calls nach verschiedenen Shadern aufspalten müsste.
Meh, irgendwie komme ich da nicht so richtig auf eine Idee oder Lösung, mit der ich sowohl flexibel, als auch performant wäre.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.09.2012, 15:19

Kannst du nicht einfach zwei Batches machen, einen für deine normalen und einen für deine speziellen Sprites und die nacheinnander rendern?

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.09.2012, 21:12

Ja, das ginge und ist am Ende vermutlich auch die einzig variable Lösung. Solche Probleme zeigen mir aber immer wieder, wie sehr Rendering-APIs und -Hardware eigentlich noch in den Kinderschuhen stecken, weil sie bei Shadern mit Zugriff auf bisherige Render-Ergebnisse oder multiple Shader doch sehr unflexibel sind.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.09.2012, 21:38

Möglich, dass ich dich falsch verstanden hab, aber das liegt ja wohl vor allem einfach daran, dass Grafikkarten extrem parallel arbeiten; solche Abhängigkeiten würden unter einer gewissen Granularität rein prinzipiell die Performance killen, das hat imo nicht viel mit Kinderschuhen zu tun. Oder wie genau meinst du, wäre das besser hinzubekommen?

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

20.09.2012, 21:41

Ach nein? Wenn ich Shader-Programme anhand von Attributen wählen könnte, dann wäre das überhaupt kein Problem. Klar, das wäre nicht trivial in Hardware zu bauen, aber das habe ich auch nie behauptet. Die Parallelität würde dabei aber kein Stück tangiert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

20.09.2012, 21:44

Ok, ich bin mir nicht sicher ob ich dich richtig verstanden hab. Du hättest also gerne GPUs die wie eine normale CPU nach dem SISD Prinzip arbeiten und nicht nach SIMD!?

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

20.09.2012, 21:53

Nein. Ich hätte gern SIMD, aber eben die Möglichkeit zwischen verschiedenen Shadern in einem einzigen Pass/Call wechseln zu können, wie man eben auch auf verschiedene Texturen oder Buffer zugreifen kann. Als Trigger über ein Attribut oder so, das wäre sehr nice. Momentan muss man ja leider entweder einen sehr großen Shader schreiben, der alles kann oder verschiedene Passes für jeden Shader einzeln machen. Aber gut, die Debatte sollten wir lieber lassen, ich weiß ja, dass Du gern die aktuellen Architekturen verteidigst und nur sehr schwer Kritik oder Änderungswünsche/Erweiterungen an ihnen zulässt, auch wenn mir nicht so ganz klar ist warum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

20.09.2012, 22:09

Nein. Ich hätte gern SIMD, aber eben die Möglichkeit zwischen verschiedenen Shadern in einem einzigen Pass/Call wechseln zu können, wie man eben auch auf verschiedene Texturen oder Buffer zugreifen kann. Als Trigger über ein Attribut oder so, das wäre sehr nice.

Ok, du hättest ultimativ also gern sowas wie dlls für Shader (Function Pointer gibts zumindest in CUDA ja mittlerweile, aber die funktionieren afaik leider noch nicht über Modulgrenzen)? Mit Dynamic Shader Linkage gibts seit Direct3D 11 zumindest mal einen Weg um das Permutationsproblem auf den Treiber abzuwälzen, wie's damit in OpenGL aussieht, weiß ich grad ehrlich gesagt nicht auswendig. Sowas würd ich mir jedenfalls auch wünschen; spätestens wenn wir auf der GPU endlich einen Unified Address Space haben (ich hoffe doch sehr bald), werden wir das ja hoffentlich auch bekommen...

Aber gut, die Debatte sollten wir lieber lassen, ich weiß ja, dass Du gern die aktuellen Architekturen verteidigst und nur sehr schwer Kritik oder Änderungswünsche/Erweiterungen an ihnen zulässt, auch wenn mir nicht so ganz klar ist warum.

Ich glaub du hast da irgendwie einen falschen Eindruck von mir bekommen... ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (20.09.2012, 22:16)


BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

20.09.2012, 22:18

Ja, erstaunt mich gerade selbst etwas. Genau soetwas stelle ich mir irgendwie vor, ja. Wie genau, weiß ich nicht, aber diese Beschränkung ist schon eher hinderlich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige