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

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

11

30.03.2013, 22:47

Die Frage ist eher: warum brauchst Du den Wert? Du wirst natürlich den Wert genau so auf der CPU berechnen müssen, wenn Du ihn genau so brauchst. Von der GPU zurücklesen ist in quasi allen Fällen eine Dumme Idee (tm). Darum lautet die Devise üblicherweise: was auf die GPU geht, bleibt auf der GPU bis zum Ende.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

FSA

Community-Fossil

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

12

30.03.2013, 23:12

Also ist das beste was ich machen kann, die Vertizes im Programm direkt mit der Weltmatrix zu multiplizieren und mit den Vektoren dann weiter zu rechnen? Ist das nicht zu langsam?

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

13

30.03.2013, 23:24

Klar ist das langsam, die Frage ist ja auch, warum du sowas würdest tun wollen!? ;)

FSA

Community-Fossil

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

14

30.03.2013, 23:54

Ich brauche die Variable lightDir, um Berechnungen im Pixelshader durchzuführen. Da ich für jedes Licht einen anderen Wert für lightDir habe, und ich kein Multipassverfahren mehr anwenden will, brauche ich ein Array, welches für alle Lichter die Werte von lightDir enthält. Da ich das Array nicht an den Pixelshader übergeben kann (Grundfrage), wollte ich gerne jegliche Berechnung des Vertexshader auf mein Programmquelltext verlagern, damit ich das Array global im Shader nutzen kann. Somit auch im Pixelshader. Um das Array zu berechnen, brauche ich aber die Position jedes einzelnen Vertex transformiert in die Weltkoordinaten. Zur Lösung fallen mir nur zwei Sachen ein:
1. Das schon genannte (Vertices mit der Weltmatrix im Programm multiplizieren und damit weiterrechnen)
2. Zwei Pässe nutzen. Einmal eine Textur rendern mit der Variable lightDir als Farbwert und im zweiten Pass dann aus der Textur wie aus eine Normalenmap samplen.

Andere Vorschläge? Was ist die bessere Überlegung?

Zitat

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

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

15

31.03.2013, 01:29

Da bist Du völlig auf dem Holzweg. Irgendwas in Sachen Lichtberechnung auf der CPU zu machen ist eine Dumme Idee (tm). Da brauchst Du wirklich wirklich wirklich gute Gründe, bevor Du überhaupt daran denken darfst. Stattdessen solltest Du folgendes tun:

- Du berechnest bisher die TBN-Matrix im VertexShader.
- Das ist die Matrix, mit der Du einen Vektor VertexposZuLichtpos in den lokalen Tangentenraum transformierst
- Weil Du, wenn Du den in den PixelShader gibst, ihn dort mittels dot() gegen die Normal Map rechnen kannst.
- Damit brauchst Du aber pro Licht mindestens ein Interpolator-Register, und davon hast Du maximal 32.
- Also machst Du stattdessen alle Berechnungen im PixelShader.
- Du transponierst die oben genannte TBN-Matrix, so dass sie jetzt vom lokalen Tangentenraum in Objektkoordinaten transformiert
- Von da transformiert die World Matrix in Weltkoordinaten. Multipliziere die also im VertexShader hintendran an die inverse TBN-Matrix
- Du hast jetzt im VertexShader eine Matrix, die vom lokalen Tangentenraum in den globalen Welt-Koordinatenraum transformieren kann
- Gib also statt irgendwelcher Per-Licht-Daten die in den PixelShader rein
- Du kannst jetzt mit dieser Matrix im PixelShader die Position des Vertex und die Normale aus der Normal Map in Weltkoordinaten umrechnen
- Und damit alle Lichtberechnungen in Weltkoordinaten machen
- Jetzt brauchst Du nur noch ein Array aller Lichtdaten in Weltkoordinaten im PixelShader anstatt bisher im VertexShader
- Und kannst jetzt pro Pixel alle Berechnungen gegen alle Lichter machen
- Die Grenze der maximalen Anzahl Lichter hängt jetzt von den Konstantenregistern ab
- Und davon hast Du ab DX10 64000.
- Problem gelöst.

Probiere es aus. Und mach Dich fit in Sachen Matrizen, Koordinatenräumen und Transformationen zwischen diesen Räumen. Das ist hundewichtig und hier essentiell für die Problemlösung. Schreibe Dir für jeden einzelnen Variable in jedem einzelnen Shader-Abschnitt auf, in welchem Koordinatensystem dieser Wert vorliegt. Dann siehst Du schnell, welche Transformationen Du wo anwenden musst, um die Daten alle in den gleichen Koordinatenraum zu bekommen. Und alle Daten im gleichen Koordinatenraum zu haben ist die Grundvoraussetzung, um sie miteinander verrechnen zu können.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

FSA

Community-Fossil

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

16

31.03.2013, 12:59

Ahaa! Dann mache ich mich mal dran das nieder zuschreiben. Ich werde mich auf jeden Fall nochmal melden. Ich weiß jetzt schon, dass ich da Probleme bekommen werde ;)
Danke schon mal.

Zitat

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (31.03.2013, 13:04)


Werbeanzeige