在离屏位图上应用像素着色器

4

我目前正在尝试使用在 .NET 3.5 SP1 中引入的像素着色器来提高图像处理性能。所有操作都变得更快了,但到目前为止,我只是对我的 WPF 表单中的一些元素应用了效果,而实际上我想避免这种情况。

我们有一堆图像处理功能,我想逐步用像素着色器替换其中的一些内容以提高性能。是否有一种方法可以将这样的像素着色器应用于 ImageSource 而不必显示它?

2个回答

4
在C++ / DirectX中实现此目的通常需要执行以下操作:
准备工作(仅需一次):
- 使用CreateRenderTarget创建渲染目标。 - 使用CreateOffscreenPlainSurface创建离屏表面。 - 使用SetRenderTarget设置渲染目标表面。 - 创建任何其他所需的输入资源(纹理,顶点缓冲区等)。
渲染(需要多次执行):
- 根据需要更新输入资源(纹理,缓冲区)。 - 渲染。 - 通过GetRenderTarget将渲染目标的内容复制到离屏表面。 - 锁定离屏表面并在CPU上读取其内容。

2
对于仍然需要此内容的人: 我刚刚在这里创建了一篇文章,展示了如何在WPF中实现。 http://www.codeproject.com/Articles/642151/Pixel-shaders-in-a-background-thread-in-WPF 以下是相关代码。它来自一个带有一些存储变量的类。
- Source:一个ImageSource - DpiX,DpiY:包含源Dpi的双倍精度浮点数 - img:WPF图像控件 - viewbox:WPF ViewBox控件 - WPF_DPI_X,WPF_DPI_Y:具有值96.0的常量双倍精度浮点数
1.图像img嵌入在Viewbox中(也在屏幕外)。
//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);

更多信息和演示项目,请参见本文。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接