Seite 1 von 1

Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:25
von exploid
Hallo liebe ZFX-Community

Es wird versucht eine "Animationssequenz" auf einem Billboard zu zeichnen. Die Idee ist zur Laufzeit des Programms
im GPU Programm die Texturkoordinaten zu manipulieren. Das soll in der Form geschehen, dass die Bildoffsets auf
die Texturkoordinaten addiert werden. Zuvor müssen natürlich die Texturkoordinaten der vier Billboard-vertices auf das Anfangsbild
gesetzt werden.

Bild

Nun wollte ich im Vertexshader diesen Ausdruck einsetzen:

Code: Alles auswählen

//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
VS_OUTPUT VS( VS_INPUT input )
{
    VS_OUTPUT output = (VS_OUTPUT)0;
    // Basic transformation of untransformed vertex into clip-space
    output.position = mul( input.position, World );
    output.position = mul( output.position, View );
    output.position = mul( output.position, Projection );
    // basic texture stuff
    output.light = vLightDir[0];//LightDirection;
    // calculate the normal vector
    output.normal = mul( input.normal, World );
    // calcutlate the view vector
    output.camview = CameraPosition - mul(input.position, World);
    // Texture
    output.texCoord = input.texCoord + fl2TextureAnimationOffset;  <= "HIER"
   
   
    return output;
}
fl2TextureAnimationOffset => Diese GPU-Variable ist vom Typ float2

Da wollte ich die beiden Skalare float fTextureOffsetX; float fTextureOffsetY; hineinkopieren. Diese werden von der aufrufenden Animations-Billboard-Klasse zur Laufzeit des Programms gesetzt, um das entsprechende Animationsbild "anzusteuern".

Das ganze scheitert daran weil ich nicht weiss wie ich die beiden Skalare in den zwei dimensionalen Vektor fl2TextureAnimationOffset bekomme.

Bevor mich jemand darauf hinweist, die Manual zu lesen oder diverse Suchmaschinen zu verwenden => wurde getan, ICH FIND DIE INFORMATION EINFACH NICHT. :( Das muss doch möglich sein mit HLSL zwei triviale Skalare in einen zweidimensionalen Vektor zu kopieren.

Bitte um Unterstützung

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:34
von Schrompf
Die Lösung ist wirklich so schlicht, dass Du sicherlich schon dran gedacht hast :-)

Code: Alles auswählen

float2 param = float2( ersterWert, zweiterWert);
Konstruktor-Aufruf :-)

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:45
von exploid
Hallo Schrompf

Danke für den Vorschlag.
Mit Konstanten würde der Aufruf funktionieren.
also
float2 param = float2( 2.0, 1.0);

aber das Ziel ist
float2 param = float2( fTextureOffsetX, fTextureOffsetY); => Compilerfehler: error X3011: 'fl2TextureAnimationOffset': initial value must be a literal expression

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:47
von Schrompf
Nein, mein Vorschlag geht mit allem. Sorry, aber das klingt, als hättest Du andere Probleme. In Deinem Code-Beispiel kommt die Variable gar nicht vor, die der Compiler anmeckert. Wie genau sieht Dein Code aus?

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:50
von exploid
float fTextureOffset[2];

float2 fl2TextureAnimationOffset = fTextureOffset;

Funktioniert auch nicht! :(

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 12:56
von exploid
Schrompf hat geschrieben:Nein, mein Vorschlag geht mit allem. Sorry, aber das klingt, als hättest Du andere Probleme. In Deinem Code-Beispiel kommt die Variable gar nicht vor, die der Compiler anmeckert. Wie genau sieht Dein Code aus?
Das GPU-Programm ist das Selbe wie das des Posts vom 19.03.

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 13:00
von exploid
Okay, sorry ich habs.

Ich werde einfach ein float2 in das GPU Programm "senden". Ist doch kein Problem. Das hat dann als Werte die Offsets der Animation.

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 13:02
von exploid
Danke Schrompf für die Unterhaltung => Neue Idee

update Nachtrag 23.03. :
Hab das Problem lösen können: http://www.youtube.com/watch?v=kn-6osncp6c

update 28.03 url geändert

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Verfasst: 21.03.2013, 13:56
von Schrompf
Funktioniert hätte:

Code: Alles auswählen

float2 texOffset = float2( fTextureOffset[0], fTextureOffset[1]);
Logisch, oder? Es ist aber definitiv besser, wenn Du den Parameter gleich als float2 hochlädst. Ein float[2] würde den Compiler nämlich zwingen, die Konstanten für Array-Zugriff geeignet anzuordnen. Ein float[2] endet im Speicher also so:

Code: Alles auswählen

float4 wert1 = float4( DeinErsterWert, verschwendet, verschwendet, verschwendet);
float4 wert2 = float4( DeinZweiterWert, verschwendet, verschwendet, verschwendet);
Tut jetzt nicht sonderlich weh, weil es nur zwei Werte sind, aber es ist gut, das im Hinterkopf zu behalten.