Problem bei einer Animation auf einem Billboard mit HLSL

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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
All your base are belong to us! Justice
Benutzeravatar
Schrompf
Moderator
Beiträge: 4861
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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 :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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
All your base are belong to us! Justice
Benutzeravatar
Schrompf
Moderator
Beiträge: 4861
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag von exploid »

float fTextureOffset[2];

float2 fl2TextureAnimationOffset = fTextureOffset;

Funktioniert auch nicht! :(
All your base are belong to us! Justice
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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.
All your base are belong to us! Justice
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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.
All your base are belong to us! Justice
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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
Zuletzt geändert von exploid am 28.03.2013, 13:14, insgesamt 4-mal geändert.
All your base are belong to us! Justice
Benutzeravatar
Schrompf
Moderator
Beiträge: 4861
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Problem bei einer Animation auf einem Billboard mit HLSL

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten