WPF의 Shader Effect(Pixel Shader)에 정렬을 맡기고 싶습니다.

12450 단어 HLSLWPF

개시하다


그림의 색깔 정보를 가공하고 싶을 때 픽셀 컨실러가 가장 큰 위력을 발휘한다.그리고 WPF는 이 기술과 잘 어울린다.
하나의 픽셀의 순환 처리는 색 정보를 편집할 수 있지만, 많은 픽셀을 어느 정도 똑같이 처리하면 피세르민다의 성능이 더욱 좋아질 것이다.
단점은, 사용하기가 힘들지... C++로 DirectX 프로그램을 쓰는 사람은 오히려 간단하다고 생각하겠지?
대부분의 경우 그림의 색 정보만 입력하면 충분합니다. 다음은 외부에서 제공하는 배열에 따라 색 정보를 수정할 때의 방법을 설명해 주십시오.

예제


WPF에서 피셀민다샘플 코드를 사용한다.


원래는 흑백 이미지였지만, 외부에서 주는 배열에 따라 색 정보의 표시를 바꾸었다.

HLSL 코드 예


그림(2차원 무늬)을 입력하는 것 외에 전달할 그룹을 1차원 무늬로 입력할 수 있어 비교적 쉽다.이때 피세르민다내 RGB의 색 데이터와 이미지 내의 UV 위치가 최소 0.0, 최대 1.0의 flat 값으로 대체되어 처리됨을 주의하십시오.
먼저 HLSL 코드 예제를 나타냅니다.
ArrayEffect.fx
sampler2D input : register(s0);
sampler1D array : register(s1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    // 入力画像の位置毎に色を取得する。
    float4 color = tex2D(input, uv);
    // 追加で渡した配列データは1次元の画像として扱われる。
    // 入力画像の U座標位置 (0.0-1.0) に対応した数値を
    // RGBA 値として取り出す。
    float4 tmp = tex1D(array, uv[0]);
    // 出力する色はほぼ元画像の色であるが...
    float4 result = color;
    // 赤色成分は配列で与えた値を設定する。
    result.r = tmp.r;
    return result;
}

Shader Effect급 WPF와 피세르민다의 다리


WPF에서 상기 HLSL 코드를 기반으로 한 이미지 선명도를 호출하는 프로그램은 기본적으로 큰 변경이 없다.여기코드 예제 또는 위의 HLSL 코드를 컴파일하려면는 참고입니다.
ShaderEffect의 클래스를 계승한 모든 코드를 보려면 누르십시오
ArrayEffect.cs
public class ArrayEffect : ShaderEffect
{
    public static readonly DependencyProperty InputProperty 
        = RegisterPixelShaderSamplerProperty(
            "Input", typeof(ArrayEffect), 0
        );

    public static readonly DependencyProperty ArrayProperty
        = RegisterPixelShaderSamplerProperty(
            "Array", typeof(ArrayEffect), 1
        );
    public ArrayEffect()
    {
        var ps = new PixelShader();
        // 上で紹介した HLSL コードは、fxc コマンド
        // (Visual Studio Tools フォルダに含まれている、
        //  CUIからコンパイルを行う際等に使用する
        //  コマンドプロンプト等から使えます)
        // でコンパイルして ArrayEffect.ps ファイルとした上で、
        // プロジェクトに追加してビルドアクションを Resource にすると、
        // このコードで参照できるようになります。
        var asm = typeof(ColormapEffect).Assembly;
        var asmName = asm.GetName().Name;
        var uri = new Uri(
            "pack://application:,,,/" + asmName + ";component/Effects/ArrayEffect.ps",
            UriKind.RelativeOrAbsolute
            );
        ps.UriSource = uri;

        this.PixelShader = ps;
        UpdateShaderValue(InputProperty);
        UpdateShaderValue(ArrayProperty);
    }

    public Brush Input
    {
        get { return (Brush)GetValue(InputProperty); }
        set { SetValue(InputProperty, value); }
    }

    public Brush Array
    {
        get { return (Brush)GetValue(ArrayProperty); }
        set { SetValue(ArrayProperty, value); }
    }
}

WPF 측에서 데이터를 배열하여 ShaderEffect 계승 클래스에 건네주기


마지막으로 WPF 측에서 전달하려는 배열을 1차원 이미지 데이터로 준비해야 합니다.나는 이 부분의 코드 예가 가장 직관적이라고 생각한다.
(WriteableBitmap 사용 예)
using System.Windows; // For Int32Rect
using System.Windows.Media; // For PixelFormats, ImageBrush
using System.Windows.Media.Imaging; // For WriteableBitmap

    ......

    // 幅 255, 高さ 1 の書き込み可能なビットマップを用意
    // 今回は 8 bitの白黒画像を与えてみる
    // ここでは 0-255 の byte値であるが、
    // ピクセルシェーダに渡されると
    // 0.0-1.0 の float値になることに注意する
    // 恐らく PixelFormats.Gray16 等とするとまた事情が変わる
    var wb = new WriteableBitmap(
        255, 1, 96.0, 96.0,
        PixelFormats.Gray8, null
        );
    var array = new byte[255];
    (→  array に好きな値を設定する)
    wb.WritePixels(
        new Int32Rect(0, 0, wb.PixelWidth, wb.PixelHeight),
        array, 
        wb.PixelWidth * wb.Format.BitsPerPixel / 8, 0
        );
    var arrayEffect = new ArrayEffect();
    // ピクセルシェーダに上記の設定で画像を渡す際には Brush 型にする
    arrayEffect.Array = new ImageBrush(wb);
    (  arrayEffect  WPFコントロールの Image 等の
     Effect プロパティに設定すると、色に変化が付く)
이렇게 하면 WPF의 GUI에 있는 이미지에 대해 상세한 맞춤형 효과를 적용할 수 있다.
그럼 여러분, 피세르민다+WPF 좋은 생활을 하세요.

좋은 웹페이지 즐겨찾기