Frage zu nVidia und ATI SDK samples

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
sirnoname
Beiträge: 67
Registriert: 20.06.2010, 11:04

Frage zu nVidia und ATI SDK samples

Beitrag von sirnoname »

Hallo,

ich möchte gerne eine allgemeine Meinung von Experten, die viel mit den Pixel Shader Samplen und den Vertex Shader zu tun haben.
Gibt es eine Art Gemeinsamkeit bei der Übergabe der Kamera Position an einen Shader.
Klar, kann jeder Shader Programmierer es machen wie er will, aber Firmen wie nVidia einigen sich doch bestimmt auf ein Format?
Was ich meine, korrigiert mich wenn ich falsch liege:
Die Übergabe der Kameraposition geschieht über SetFloat, wobei dies als 4x4 Matrix, als 3x3 Matrix oder als 2 bis 3 mal 4fach Floats (Position, Blickrichtung, Oben-Vektor) bestehen könnte.
Wie sieht es hier bei den Samples aus? wird eine bestimmte Übergabe der Positionsdaten von nVidia oder ATI bevorzugt?
Gibt es sonst noch andere eingesetzte Übergaben ausser mit SetFloat? (wie würdet Ihr es übergeben)

Grüße
SirNoName
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Frage zu nVidia und ATI SDK samples

Beitrag von Zudomon »

Hallo SirNoName!

Also wie die handhabung in Bezug auf nVidia und ATI ist, kann ich dir leider nicht sagen. Aber wie du schon richtig festgestellt hast, ist die übergabe wirklich jedem selbst überlassen. Genau deswegen kam es ja zu der Shaderentwicklung, um möglichst weg von einer vorgegebenen standardisierten Renderpipeline zu kommen.

Im Endeffekt solltest du nur genau das übergeben, was auch wirklich für den Shader gebraucht wird. Allerdings kann das je nachdem eine ganze Menge sein. Wenn man im Shader nichts mehr machen muss, z.B. weil das, was du abbilden willst nur 2D ist, dann könntest du komplett ohne Übergaben auskommen. Ich meine, dass ich bei meinem Fullscreenquad keine extra Konstanten gebraucht hatte.
Wenn sich Objekte bereits im Worldspace befinden, dann würde für die komplette Szene (also alle Objekte im Worldspace) eine einzige Matrix reichen, in der dann View- und Projectionmatrix multipliziert ist. Willst du jedes Objekt einzeln transformieren, ist eine extra Worldmatrix notwendig. Und, sobald Skalierungen ins Spiel kommen, die nicht jede Achse gleich skalieren, muss zu jedem Objekt noch eine extra Worldnormalmatrix dazugepackt werden.
Ich schweife etwas ab... aber um auf deine eigentliche Frage zurückzukommen, die Kameraposition selbst steckt in den Matrizen, die da übergeben wurden... meistens die Viewmatrix. Allerdings ist es schwer, diese wieder daraus zu lesen und ich übergebe einfach die Kameraposition explizit selbst. Das ist am wenigsten Aufwand und ich denke einfach, der eine Vektor der nochmal als Konstante übergeben wird fällt nicht ins Gewicht. Zumal das rausrechnen der Position aus einer Viewmatrix auch rechenzeit beansprucht.

Die Matrix wird doch über SetMatrix und der Vektor über SetVector übergeben?
sirnoname hat geschrieben:Gibt es sonst noch andere eingesetzte Übergaben ausser mit SetFloat? (wie würdet Ihr es übergeben)
Wenn du jetzt hier nur in Bezug auf die Kameraposition/Richtung/Up-Vektor meinst, dann sollten diese zu einer ViewMatrix transformiert und dann mit SetMatrix übergeben werden. Falls du die Kameraposition, seltener noch die beiden anderen Vektoren für spezielle Shader nochmal extra brauchst, könntest du die dann mit SetVector übergeben.
Falls du generell meinst, da gibt es noch SetInt, SetBool, SetTexture und noch ein paar weitere...

Ich hoffe, dass hat dir schonmal ein wenig weitergeholfen. :)

Gruß
Zudo
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Frage zu nVidia und ATI SDK samples

Beitrag von Krishty »

Hi,

In 99 % der Fälle als 4×4-Matrix, weil sich darin nicht nur die Position und Orientierung des Betrachters ausdrücken lässt (Position, Blickrichtung und Up-Vektor sind ja schon drei von vier Spalten/Zeilen einer Matrix), sondern auch der Projektionsvorgang und die Position und Rotation von den Objekten, die man darstellen will. Durch die Matrixmultiplikationen ist da zwar nichts mehr im Klartext rauszulesen, aber die Informationen sind aber drin zusammengefasst.

3×3-Matrizen sind eine Seltenheit, weil man damit nur Rotation, nicht Verschiebung darstellen kann. Auch benötigt eine Projektionsmatrix mindestens vier Zeilen/Spalten; wenn man also die Projektion in einem Rutsch mit der Rotation durchführen möchte (was so ziemlich immer der Fall ist), reichen 3×3-Matrizen nicht mehr aus. In anderen Bereichen, wo man nur Orientierungen und keine Positionen ausdrücken möchte (Tangent-Space für Normal- und Parallax-Mapping), werden sie aber häufiger genutzt.

Zusätzlich zur 4×4-Matrix übergibt man die Position oft als einzelnen 3D-Vektor, weil bestimmte Effekte die präzise Distanz zum Betrachter oder den Abstandsvektor zwischen Geometrie und Betrachter erfordern. Da man die Betrachterposition nicht im Klartext aus der Matrix herauslesen kann, ist es schneller, mal schnell einen zusätzlichen 3D-Vektor zu setzen und dafür zu benutzen.

Unabhängig vom Hersteller ist die Übergabe als 4×4-Matrix am schnellsten, weil man dort – wie gesagt – von Verschiebung bis Projektion alles in einer einzigen Matrixmultiplikation auf die Geometrie anwenden kann, was bedeutend schneller ist als erst zu verschieben, dann zu rotieren, dann wieder zu verschieben und wieder zu rotieren und dann die Projektion durchzuführen.

Ich persönlich benutze 4×4-Matrizen mit einer manuellen Matrixmultiplikation, die ein bisschen Rechenzeit spart, da die W-Werte meine Geometrie immer 1 sind. Was die SDK-Samples tun, weiß ich nicht.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
sirnoname
Beiträge: 67
Registriert: 20.06.2010, 11:04

Re: Frage zu nVidia und ATI SDK samples

Beitrag von sirnoname »

Hallo,

erstmal danke für die Antworten :)
Ich befasse mich mit Hooks um näher an die verschiedenen Game Engines hinzukommen. Besonders die Funktionsaufrufe kann man dort recht gut verfolgen.
Ich halte nicht viel von den DXUtils und programmiere lieber selber direkt am Kern der Schnittstelle zur Grafikkarte, ist halt dann auch etwas komplexer.
Aus meinen Erfahrungen her wird SetMatrix so gut wie gar nicht verwendet. SetVector sehr selten und nicht für die Kameraübergaben.
Den Sieger machte SetFloat. Man kann jedoch mit SetFloat auch ein SetMatrix und SetVector realisieren, wodurch ich zuerst vermutete, das 4x4 Matrixen das Rennen machen.
Stattdessen werden vornehmlich 4 Floats übergeben, die Position und die Blickrichtung (als Vector aus 4 Floats) einzeln hintereinander :o

Nun stelle ich mir die Frage ob das daher kommt, da Grafik Programmierer einfach die von nVidia und ATI zur Verfügung gestellten PixelShader Samples benutzen, in ihre Spiele einbauen und diese grundsätzlich gleich angesprochen werden. Wenn ich es richtig verstehe dann hat ein Shader Programmierer jeweils von ATI und nVidia einen Effektebrowser und wählt die gewünschten Effekte aus die er dann verbessert oder modded.

Was haltet Ihr von dieser Erkenntnis?

Grüße
SirNoName
Antworten