PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Direct3D. Daten für Shader in Textur speichern?


PatkIllA
2007-11-12, 17:30:10
Ich habe einige tausend Objekte mit je ein paar dutzend Polygonen.

Jetzt möchte ich die Dreiecke im Pixelshader nach bestimmten Regeln einfärben und bräuchte dafür aber ein paar zusätzliche Informationen (erstmal alles float oder Vektoren mit mehreren floats), die pro Objekte gleich sind.

Jetzt könnte ich ja mein Vertexformat aufblähen oder jedes Objekt mit einem eigenen Call zeichnen und vorher die Werte setzen.
Beides wahrscheinlich keine gute Idee nehme ich mal an, oder?

Jetzt dachte ich doch daran, dass ich die Daten auch in eine Texture auslagern könnte und mr im Shader die entsprechende Stelle samplen könnte.

Ich habe war schon Texturen mit GDI erstellt, aber die waren auch Texturen im eigentlichen Sinne.

Und ich stehe jetzt bei mindestens 2 Sachen auf dem Schlauch:
Wie erstelle ich eine Texture mit den floats oder am besten noch mit verschiedenen Typen?
Wie stelle ich sicher, dass ich beim Samplen den korrekten Wert erhalte und nicht durch irgendwelche Texturfilterungen einen veränderten? Ich kann zwar auf Pointsampling umstellen, aber hilft das auch, wenn der Benutzer im Treiber etwas forciert hat?

Coda
2007-11-12, 17:34:24
Ich nehm an du meinst Direct3D 9?

PatkIllA
2007-11-12, 17:48:24
wäre nicht schlecht, wenn es da auch noch ginge :)
Shader3 wäre aber noch zu vertreten.

Neomi
2007-11-12, 17:52:56
Wie erstelle ich eine Texture mit den floats oder am besten noch mit verschiedenen Typen?

Wie bei jeder Textur: Ressource erstellen und mit den Daten füllen.

Wie stelle ich sicher, dass ich beim Samplen den korrekten Wert erhalte und nicht durch irgendwelche Texturfilterungen einen veränderten? Ich kann zwar auf Pointsampling umstellen, aber hilft das auch, wenn der Benutzer im Treiber etwas forciert hat?

Wenn du explizit Pointsampling anforderst, muß der Treiber sich daran halten, unabhängig von irgendwelchen Usereinstellungen. Eine andere Möglichkeit bleibt zumindest bis einschließlich D3D9 nicht.

PatkIllA
2007-11-12, 20:18:20
Wie bei jeder Textur: Ressource erstellen und mit den Daten füllen.
Noch ein paar Stichpunkte für die weitere Suche?

Wenn du explizit Pointsampling anforderst, muß der Treiber sich daran halten, unabhängig von irgendwelchen Usereinstellungen. Eine andere Möglichkeit bleibt zumindest bis einschließlich D3D9 nicht.Was ist denn bei D3D10 neu?
Meine Idee wäre aber schon der richtige Ansatz?

Neomi
2007-11-12, 20:25:53
Noch ein paar Stichpunkte für die weitere Suche?

IDirect3DDevice9::CreateTexture (http://msdn2.microsoft.com/en-us/library/bb174363.aspx)
IDirect3DTexture9::LockRect (http://msdn2.microsoft.com/en-us/library/bb205913.aspx)

Was ist denn bei D3D10 neu?
Meine Idee wäre aber schon der richtige Ansatz?

In Direct3D 10 kann man auch direkt ungefiltert aus Buffern fetchen, insgesamt hat sich bei den Shaderressourcen einiges getan. Dein Ansatz scheint mir nicht verkehrt zu sein, bei der knappen Beschreibung fällt mir zumindest für D3D9 kein anderer Weg auf Anhieb ein.

Wie sind denn deine Vorkenntnisse im Bereich Grafikprogrammierung?

PatkIllA
2007-11-12, 20:45:05
Der erste Anwendungsfall wären Schraffuren, die ich per Pixelshader zeichnen möchte.
Da brauche ich pro Ebene aber schon Informationen über Liniendicke, Farbe.
Ich habs schon mal mit Texturen versucht, aber da muss ich halt dauernd die Textur umsetzen und das bremst schon. Eine einfache Variante mit einer Schraffur per Shader hab ich schon, aber für die endgültige Fassung brauche ich mehr Daten.
Jetzt wollte ich eine Textur machen und z.B. in eine Zeile die Daten zu je einem Objekt packen und den Vertices zu dem Objekt einen Index mitgeben, um zu wissen in welcher Zeile der Textur ich schauen muss.

Ich hab vor Jahren mal einfache 3D Dinge im Rahmen einer Univorlersung gemacht und bin jetzt seit ein paar Wochen an der Shaderprogrammierung. Ich komme sonst eher aus der Webecke.

Neomi
2007-11-12, 21:18:24
OK, jetzt habe ich einen ungefähren Überblick über das, was du machen willst.

Die Textur erstellst du ganz normal, da du Texturen schonmal benutzt hast (eben nur eine pro Schraffur) wird das kein Problem sein. Da du sie als Datentextur benötigst, brauchst du auch nur eine einzige Mipstufe (nicht 0 als Parameter angeben, dann wird nämlich die komplette Mipchain erstellt). Das Format hängt natürlich davon ab, was für deine Zwecke ausreicht. Nach dem Erstellen der Textur wird diese gelockt, du bekommst einen Pointer und schreibst die Daten rein, dann der Unlock.

Die Vertices bekommen dann die Daten, wobei alle Vertices eines Primitives die gleichen Daten bekommen. Diese werden dann 1:1 an den Pixelshader übergeben, der damit Texturkoordinaten für einen Dependant Texture Lookup zusammenbastelt (der Pixelshader muß die Dimensionen der Textur kennen). Damit werden die Daten dann gelesen und entsprechend benutzt.

tokugawa
2007-11-12, 22:04:02
Der erste Anwendungsfall wären Schraffuren, die ich per Pixelshader zeichnen möchte.
Da brauche ich pro Ebene aber schon Informationen über Liniendicke, Farbe.
Ich habs schon mal mit Texturen versucht, aber da muss ich halt dauernd die Textur umsetzen und das bremst schon. Eine einfache Variante mit einer Schraffur per Shader hab ich schon, aber für die endgültige Fassung brauche ich mehr Daten.
Jetzt wollte ich eine Textur machen und z.B. in eine Zeile die Daten zu je einem Objekt packen und den Vertices zu dem Objekt einen Index mitgeben, um zu wissen in welcher Zeile der Textur ich schauen muss.

Ich hab vor Jahren mal einfache 3D Dinge im Rahmen einer Univorlersung gemacht und bin jetzt seit ein paar Wochen an der Shaderprogrammierung. Ich komme sonst eher aus der Webecke.


Für schraffierte Dinge solltest du dir mal die diversen Papers die es zu "Hatching" und non-photorealistic-Rendering (NPR) gibt anschauen. Da gibt's verschiedene Ansätze, wo einige auch eher "GPU-friendly" sind. Wenn das das ist was du vorhast zumindest.

PatkIllA
2007-11-12, 22:26:48
Hab ich sogar schon nach gesucht. Die meisten haben eher so künstlerische Schraffuren vor und sind komplizierter als ich es brauche. Bei mir ist es eher technisch orientiert.
Hab ich denn schon was GPU-unfriendly gesagt?
Und das mit den zusätzlichen Daten brauche ich auch noch für mindestens zwei andere Dinge.

PatkIllA
2007-11-13, 15:21:23
Ich glaub ich hab es jetzt mit einer A32B32G32R32F Textur.
In HLSL gibt es nicht zufällig so Hilfsfunktionen, die Matrizen zum Verschieben, Drehen usw. Erstellen?

Coda
2007-11-13, 15:39:20
Ne, aber in D3DX.

PatkIllA
2007-12-31, 16:46:10
Mal ausgrab.
Ich habe mein Projekt jetzt nach XNA konvertiert, aber ich weiß nicht wie ich die Textur (SurfaceFormat.Vector4) füllen soll.
Ich hate das vorher mit Graphicsstream geacht, aber das gibt es nicht mehr.
Die Doku spricht zwar von Direct memory access is not a feature of the XNA Framework, and data access has been restricted to specific type-safe classes, generic accessors, and arrays. The new access patterns are not only easier to implement, but in many scenarios they are much faster. aber ich weiß nicht wie ich mein Vector4 Array in die Texture bekomme.

Gnafoo
2008-01-04, 02:54:07
Geht nicht folgendes?


Texture2D texture = new Texture2D(device, 512, 512, 0, ResourceUsage.None, SurfaceFormat.Vector4);

Vector4[] data = new Vector4[512 * 512];
FillWithSomethingUseful(data);

texture.SetData(data);

PatkIllA
2008-01-04, 09:14:49
ja geht. Ich Depp hatte de Klasse nur als "Texture" generiert und die hat keine SetData Methode.
Bei Managed DirectX hieß die Oberklasse halt BaseTexture und davon hat dann die Texture Klasse geerbt.