Frage zu arrays in HLSL



  • Hallo zusammen
    Ich bin gerade dabei HLSL zu erlernen und habe nun folgendes Problem:
    Ich bin gerade dabei, einen Wassershader zu schreiben und möchte zur Laufzeit neue Wellen einfügen können. Nun ist es so, dass ich keine Möglichkeit von dynamischen Arrays in HLSL gefunden? Ich wäre auch schon mit statischen Arrays zufrieden, deren Grösse aber erst zur Laufzeit bekannt sein kann. Ich hatte dies folgendermassen versucht:

    int      NumberOfWaves;
    float2   Direction[NumberOfWaves];
    float    Amplitude;
    float    Frequency;
    float    Velocity;
    float    Time;
    

    Hat aber leider nicht geklappt. :p
    Weiss vielleicht jemand von euch, wie das geht?

    Lg Samuel



  • Du nimmst eine sinnvolle konstante maximale Wellenanzahl an und setzt die Amplituden der ueberfluessigen auf 0.



  • Ja so kann man es natürlich auch machen. Ich nehme an, dass dies bedeutet, dass HLSL keine dynamischen Arrays kennt? :p

    Noch eine weitere Frage:
    Ich habe teilweise recht lange Formeln und da ist es sehr mühsam und unübersichtlich ständig alle Variablennamen voll auszuschreiben. Trotzdem sollten diese nach aussen hin natürlich einen sinnvollen und selbsterklärenden Namen haben.

    Soviel ich weis, kann man dieses Problem auf folgende Weise lösen:
    float Dir:Direction;
    Auf diese Weise kann ich innerhalb von meinem Shader Dir verwenden und ausserhalb, Direction.

    Aber wie mache ich dies nun mit Arrays? Ich habs folgendermassen versucht:
    float Dir[4]:Direction;
    Zwar kompiliert dieser Code anstandslos, allerdings wird dafür zur Laufzeit eine Exception von der Effektklasse geworfen, weil die Typen nicht vom korrekten Typ zu sein scheinen...

    Wie macht man es richtig?



  • Ich nehme an, dass dies bedeutet, dass HLSL keine dynamischen Arrays kennt?

    "Arrays" heissen im Shader "Texturen".


  • Mod

    arrays sind nur statisch moeglich. man kann darauf im vertexshader dynamisch indizieren, in pixelshader wohl nur in den allerneusten versionen.
    das beste ist fuer jede wellenanzahl eine permutation zu generieren.


Anmelden zum Antworten