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.
(gelöst) [HLSL] Von Funktionen in Arrays schreiben
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
(gelöst) [HLSL] Von Funktionen in Arrays schreiben
Zuletzt geändert von Krishty am 07.10.2010, 18:20, insgesamt 1-mal geändert.
Re: [HLSL] Von Funktionen in Arrays schreiben
Vielleicht kannst du das Array auf eine Textur abbilden und da die Werte rein rendern und dann uminterpretieren. Aber bidirektional wird sicher schwierig.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [HLSL] Von Funktionen in Arrays schreiben
Nein; unmöglich. Das Array ist de facto ein Textur-Cache. Kurze Verdeutlichung: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.
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
-
- Establishment
- Beiträge: 130
- Registriert: 01.03.2009, 14:21
- Alter Benutzername: frittentuete
Re: [HLSL] Von Funktionen in Arrays schreiben
Hi,
Function Arguments (DirectX HLSL):
Function Arguments (DirectX HLSL):
traue mich kaum zu fragen, aber hast du es schonmal mit nem globalen Array versucht? :oops: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.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [HLSL] Von Funktionen in Arrays schreiben
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.
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.
-
- Establishment
- Beiträge: 130
- Registriert: 01.03.2009, 14:21
- Alter Benutzername: frittentuete
Re: (gelöst) [HLSL] Von Funktionen in Arrays schreiben
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
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
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: (gelöst) [HLSL] Von Funktionen in Arrays schreiben
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.
… oder benutzt hinterher mehr Zahnstocher.