Ich versuche, den Code einiger HLSL-Shader in der WPF-Pixel-Shader-Effektbibliothek in Codeplex anzupassen, um einen Pixel-Shader zu erstellen, der einen diagonalen Übergang von Texture1 zu Texture2 erstellt, indem Texture2 über Texture1 geschoben wird, als würde er überlagert (dh Texture1) bleiben "stationär", während Texture2 Texture1) in der oberen linken Ecke schrittweise ersetzt.

Ich habe Probleme, die "UV" -Notation richtig zu verstehen und sie zu manipulieren, um mein Ziel zu erreichen.

Bisher habe ich es versucht

float Progress : register(C0);

sampler2D Texture1 : register(s0);
sampler2D Texture2 : register(s1);

struct VS_OUTPUT
{
    float4 Position  : POSITION;
    float4 Color     : COlOR;
    float2 UV        : TEXCOORD;
};

float4 SampleWithBorder(float4 border, sampler2D tex, float2 uv)
{
    if (any(saturate(uv) - uv))
{
    return border;
}
else
{
    return tex2D(tex, uv);
}
}

float4 SlideDiagonal(float2 uv,float progress)
{
  uv += progress;

  float4 c1 = SampleWithBorder(float4(0,0,0,0), Texture2, uv);

  if(c1.a <=0)
  {
        return tex2D(Texture1, uv);
  }

  return c1;
}

//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(VS_OUTPUT input) : COlOR
{
  return SlideDiagonal(input.UV, Progress/100);
}

Und auch

float Progress : register(C0);

sampler2D Texture1 : register(s1);
sampler2D Texture2 : register(s0);


float4 SampleWithBorder(float4 border, sampler2D tex, float2 uv)
{
if (any(saturate(uv) - uv))
{
    return border;
}
else
{
    return tex2D(tex, uv);
}
}

float4 Shrink(float2 uv,float progress)
{
float speed = 200;
float2 center = float2(0.001, 0.001);
float2 toUV = uv - center;
float distanceFromCenter = length(toUV);
float2 normToUV = toUV / distanceFromCenter;

float2 newUV = center + normToUV * (distanceFromCenter *(progress*speed+1));

float4 c1 = SampleWithBorder(float4(0,0,0,0), Texture2, newUV); 

if(c1.a <= 0)
{
    return tex2D(Texture1, uv);
}

return c1;

}

//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(float2 uv : TEXCOORD) : COlOR
{
return Shrink(uv, Progress/100);
}

In beiden Fällen arbeitet die "Folie" jedoch in umgekehrter Reihenfolge, wodurch die Menge der sichtbaren Textur2 verringert wird, wenn der Fortschritt auf 1 steigt, und im Fall der ersteren wird die Textur1 überhaupt nicht angezeigt.

Ich bin über Weihnachten ein paar Mal vergeblich auf das Problem zurückgekommen, und jetzt glaube ich, dass ich unter dem Problem "Holz für die Bäume" leide.

Wenn jemand die Lösung für dieses spezielle Problem kennt, wäre er sehr dankbar.

Und im Geiste, "einem Mann das Fischen beizubringen", wenn es irgendwelche Informationen gibt, die mir helfen, zu verstehen, wie man "UV" manipuliert, wäre das auch großartig.

Vielen Dank im Voraus für Ihre Hilfe bezüglich Ian Carson

0
Ian Carson 3 Jän. 2016 im 08:22

1 Antwort

Beste Antwort

Die Texturkoordinaten (uv) geben an, wo in die Textur geschaut werden soll. Mit der Linie

uv += progress;

Sie verschieben die Texturkoordinate je nach Fortschritt. Wenn es Null ist, werden die ursprünglichen Koordinaten verwendet (und das gesamte Texture2 wird angezeigt). Durch Erhöhen von progress gehen Sie immer mehr in die untere rechte Ecke von Texture2 und zeichnen es an der ursprünglichen Position. Dadurch kann die Textur in Richtung der oberen linken Ecke verschoben werden. Wenn Sie es also umgekehrt wollen, versuchen Sie:

uv += 1 - progress;
1
Nico Schertler 3 Jän. 2016 im 09:21