Seite 1 von 1
(gelöst) [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 17:15
von Krishty
180°-Drehung: Wie schreibe ich von Funktionen aus in Arrays?
Mit inout bzw. out geht es nicht; damit wird immer nur kopiert statt das Array direkt zu manipulieren. Und Zeiger gibt es ja offenbar nicht.
Re: [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 17:24
von Despotist
Vielleicht kannst du das Array auf eine Textur abbilden und da die Werte rein rendern und dann uminterpretieren. Aber bidirektional wird sicher schwierig.
Re: [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 17:26
von Krishty
Nein; unmöglich. Das Array ist de facto ein Textur-Cache. Kurze Verdeutlichung:
Code: Alles auswählen
float Array[16];
void Fill_out(out float Foo[16]) { … }
void Fill_inout(inout float Foo[16]) { … }
void Fill(float Foo[16]) { … }
Fill_out(Array); // Die Funktion bekommt ein uninitialisiertes lokales Array "Foo"; wenn sie fertig ist, wird "Array" komplett mit "Foo"s Inhalt überschrieben
Fill_inout(Array); // Wie "out", nur, dass "Foo" beim Betreten der Funktion mit dem Inhalt von "Array" initialisiert wird
Fill(Array); // ???, scheint wie "in" zu funktionieren
Wie kriege ich
Foo innerhalb der Funktion synchron mit dem globalen
Array? Ist wichtig, weil
Array in meinem Fall
groupshared ist und simultan von anderen Threads befüllt wird.
Re: [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 18:01
von Dirk Schulz
Hi,
Function Arguments (DirectX HLSL):
Parameters are always passed by value. in indicates that the value of the parameter should be copied in from the calling application before the function begins. out indicates that the last value of the parameter should be copied out, and returned to the calling application when the function returns. inout is a shorthand for specifying both.
A uniform value comes from a constant register; each vertex shader or pixel shader invocation see the same initial value for a uniform variable. Global variables are treated as if they are declared uniform. For non-top-level functions, uniform is synonymous with in. If no parameter usage is specified, the parameter usage is assumed to be in.
traue mich kaum zu fragen, aber hast du es schonmal mit nem globalen Array versucht? :oops:
Re: [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 18:08
von Krishty
Die Funktion soll abwechselnd in verschiedene Bereiche des globalen Arrays schreiben; ich müsste die Funktion x-mal kopieren und immer die Indizes anpassen :/ Aber so, wie es aussieht, komme ich da aber eh nicht drumherum. Ich bin gerade – ohne Spaß – dabei, die 30-Zeilen-Funktion zum Makro zu machen, damit es endlich funzt.
Edit: ARGH! Klar! Ich kann der Funktion ja den Index als Parameter übergeben, ab dem sie in das globale Array schreiben soll. Direkt mal probieren; schonmal thx für die Erleuchtung!
Edit 2: Ja, funzt, danke! Und mit nur 10 Sekunden Kompilierzeit auf einem Core i7. Menno; manchmal ist es auch so naheliegend. Ich hatte in einem frühen Entwurf die Daten in unterschiedlichen Arrays liegen, da wäre das nicht gegangen. Also, um zusammenzufassen: Auf groupshared kann man nur global zugreifen, weil HLSL kein by-reference kennt. Muss man Funktionen auf unterschiedliche Stellen zugreifen lassen, müssen deren Indizes eben außerhalb der Funktion berechnet und als Parameter übergeben werden.
Re: (gelöst) [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 19:07
von Dirk Schulz
Hi,
10 sek Kompilierzeit? :shock:
kann man den Shader mal sehen? Meine dauern so ca. 300ms und das mit der D3DX-Funktion. :?:
edit: kenn ich ... scheiß Bäume in scheiß Wäldern. Esst weniger Biber! :D
Re: (gelöst) [HLSL] Von Funktionen in Arrays schreiben
Verfasst: 07.10.2010, 19:14
von Krishty
Rührt vor allem da her, dass ich 32 KiB Speicher benutze – also 8192 floats, deren Nutzung der Compiler schön brav einzeln durchzuchecken scheint.
… oder benutzt hinterher mehr Zahnstocher.