Я пытаюсь адаптировать код из пары шейдеров HLSL в библиотеке эффектов пиксельных шейдеров WPF на Codeplex, чтобы создать пиксельный шейдер, который создает диагональный переход от Texture1 to Texture2 путем сдвига Texture2 в Texture1, как если бы он накладывался (т.е. Texture1 остается «неподвижным», а Texture2 постепенно заменяет Texture1) в верхнем левом углу.Как создать диагональный шейдер перехода HLSL
Я борюсь за то, чтобы правильно понимать нотацию «uv» и как манипулировать ею для достижения моей цели.
До сих пор я пытался
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);
}
, а также
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);
}
, но в обоих случаях «слайд» работает в обратном направлении, уменьшая количество видимых texture2 как прогресс увеличивается до 1 и, в случае первого Texture1 вообще не отображается.
Я вернулся к проблеме несколько раз по Рождеству безрезультатно, и теперь я думаю, что я страдаю от проблемы «дерева для деревьев».
Если кто-либо знает решение этой конкретной проблемы, будем признательны.
И в духе «научить человека ловить рыбу», если бы была какая-то информация, чтобы помочь мне понять, как манипулировать «УВ», что также было бы здорово.
Заранее большое спасибо за вашу помощь привет Ян Carson