渲染图像的效果

时间:2014-09-28 03:35:30

标签: c# wpf wpf-controls glsl hlsl

我在画布上画画。如果我在没有任何效果的情况下绘制图像,它会渲染得很好。如果我添加自定义Hue效果,我在渲染画布时会得到一些奇怪的结果。我不确定问题是来自我的着色器,还是我的呈现方式。

enter image description here

在底部没有效果。最重要的是效果。

这是HLSL着色器:

float HueDegree : register(C0);

sampler2D Samp : register(S0);

float3x3 QuaternionToMatrix(float4 quat)
{
    float3 cross = quat.yzx * quat.zxy;
    float3 square = quat.xyz * quat.xyz;
    float3 wimag = quat.w * quat.xyz;

    square = square.xyz + square.yzx;

    float3 diag = 0.5 - square;
    float3 a = (cross + wimag);
    float3 b = (cross - wimag);

    return float3x3(
    2.0 * float3(diag.x, b.z, a.y),
    2.0 * float3(a.z, diag.y, b.x),
    2.0 * float3(b.y, a.x, diag.z));
}

static const float3 lumCoeff = float3(0.2125, 0.7154, 0.0721);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 outputColor = tex2D(Samp, uv.xy);
    outputColor.rgb /= outputColor.a;

    float3 root3 = float3(0.57735, 0.57735, 0.57735);
    float half_angle = 0.5 * radians(HueDegree); // 0 to 360 degree
    float4 rot_quat = float4((root3 * sin(half_angle)), cos(half_angle));
    float3x3 rot_Matrix = QuaternionToMatrix(rot_quat);

    outputColor.rgb = mul(rot_Matrix, outputColor.rgb);

    outputColor.rgb *= outputColor.a;

    return outputColor;
}

以下是我如何呈现它:

Rect rect = new Rect(0, 0, tmpCanvas.Width, tmpCanvas.Height);

RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right,
(int)rect.Bottom, 96d, 96d, System.Windows.Media.PixelFormats.Default);
rtb.Render(tmpCanvas);

如果我用画布上的效果绘制图像,它看起来很好。只有在我渲染画布之前,才会出现问题。我已经渲染了这样的所有视觉效果,我有其他自定义效果,它们工作正常。我弄清楚了。如果我删除

outputColor.rgb /= outputColor.a;
...
outputColor.rgb *= outputColor.a;
从着色器

,然后我没有得到那个白色背景问题,但我仍然得到锯齿状的边缘。

1 个答案:

答案 0 :(得分:0)

试试这个:

rect.Effect = new BlurEffect() { Radius = 0 };
rect.Effect.BeginAnimation(BlurEffect.RadiusProperty, new DoubleAnimation(5, TimeSpan.FromMilliseconds(500)));
rect.Effect.BeginAnimation(BlurEffect.RadiusProperty, new DoubleAnimation(0, TimeSpan.FromMilliseconds(500)));