문제

현재 이미지 처리 성능을 향상시키기 위해 .NET 3.5 SP1에 도입 된 PixelShaders를 사용하여 실험하고 있습니다. 모든 것이 훨씬 빠르지 만 TIL까지는 WPF 양식의 일부 요소에 효과가 적용되어 실제로 피하고 싶습니다.

우리는 많은 이미지 처리 기능을 가지고 있으며 일부 재료를 픽셀 셰이더로 교체하여 일부 성능을 얻고 싶습니다. 이러한 픽셀 셰이더를 표시하지 않고도 이미지 소스에 적용 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

여전히 이것을 필요로하는 사람을 위해 : 나는 방금 WPF에서 그것을하는 방법을 보여주는이 기사를 여기에서 만들었습니다.http://www.codeproject.com/articles/642151/pixel-shaders-in-a-background-thread-in-wpf

아래에 복사 된 관련 코드. 저장된 변수가있는 클래스에서 나온 것입니다

  • 출처 : 이미지 소스
  • DPIX, DPIY : 소스의 DPI를 포함하는 복식
  • IMG : WPF 이미지 컨트롤
  • 뷰 박스 : WPF 뷰 박스 컨트롤
  • wpf_dpi_x, wpf_dpi_y : const 값이 96.0으로 두 배가됩니다

1. 이미지 IMG는 뷰 박스에 포함되어 있습니다 (또한 화면 오프 스크린)

//prepare images
img = new Image();
img.Stretch = Stretch.None;
viewbox = new Viewbox();
viewbox.Stretch = Stretch.None;
viewbox.Child = img; //control to render

2. IMG 및 ViewBox는 올바른 비율로 크기가 크며 일부 레이아웃 기능도 ViewBox에서 호출됩니다. 이렇게하면 셰이더가 적용된 상태에서 컨트롤을 렌더링합니다.

/// <summary>
/// Loads the image and viewbox for off-screen rendering.
/// </summary>
public void LoadImage(double width, double height)
{
    img.BeginInit();
    img.Width = width;
    img.Height = height;
    img.Source = Source;
    img.EndInit();

    viewbox.Measure(new Size(img.Width, img.Height));
    viewbox.Arrange(new Rect(0, 0, img.Width, img.Height));
    viewbox.UpdateLayout();
} 

3. 이미지의 내용을 얻으려면 다음과 같은 경우 "스크린 샷"입니다.

void SaveUsingEncoder(BitmapEncoder encoder, Stream stream)
{
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)(img.Width * DpiX / WPF_DPI_X), (int)(img.Height * DpiY / WPF_DPI_Y), DpiX, DpiY, PixelFormats.Pbgra32);
    bitmap.Render(viewbox);

    BitmapFrame frame = BitmapFrame.Create(bitmap);
    encoder.Frames.Add(frame);
    encoder.Save(stream);
} 

또한 별도의 스레드 로이 작업을 수행하려면 다음과 함께 스레드를 만들어야합니다.

thread.SetApartmentState(ApartmentState.STA);

자세한 정보 및 데모 프로젝트는 기사를 참조하십시오.

다른 팁

C# 전문가들로부터 아직 답을 얻지 못한 것을 보았을 때 C ++ DirectX Developer Perspective에서 이에 접근하려고 노력할 것입니다. 내 대답이 유용하지 않으면 적어도 올바른 방향을 가리킬 수 있기를 바랍니다. 나는 C#에 대해 거의 알지 못하고 Pixelshaders가 어떻게 지원되는지에 대해서는 아무것도 알지 못하므로 기회는 완전히 잘못되며 여기에 쓰는 내용은 전혀 적용되지 않습니다. 그러한 경우 필요에 따라 투표를 자유롭게 의견을 말하거나 다운하십시오.

일반적으로 C ++ / Directx에서 수행하여이를 달성하는 것은 다음과 같습니다.

준비 (한 번 완료)

  • CreaterenderTarget을 사용하여 렌더링 대상을 만듭니다
  • CreateOffscreenPlainsurface를 사용하여 오프 스크린 표면을 만듭니다
  • SetRenderTarget을 사용하여 렌더링 대상 표면을 설정합니다
  • 필요한 다른 입력 리소스 생성 (텍스처, 정점 버퍼 ...)

렌더링 (여러 번 완료)

  • 필요에 따라 입력 리소스 (텍스처, 버퍼) 업데이트
  • 세우다
  • getRenderTarget을 통해 렌더링 대상의 내용을 오프 스크린 표면에 복사하십시오.
  • 오프 스크린 표면을 잠그고 CPU에서 내용을 읽으십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top