使用DirectX HLSL像素着色器为照片创建图像效果

时间:2012-08-16 13:23:35

标签: image-processing directx gdi+ pixel-shader

是否可以使用DirectX像素着色器为照片创建图像效果?我有一个C ++应用程序,其中包括一种照片数据库管理器。它利用GDI +进行图像处理,我想为用户提供一些奇特的图像效果 - 我想通过DirectX像素着色器来做。我想实现类似的效果,例如Shazzam Tool提供开箱即用的示例库 - 不幸的是我使用纯GDI +而没有WPF。

为了在GDI +位图中创建图像效果,我想到了以下步骤:

1)通过GDI +

加载图像

2)初始化DirectX,加载/编译着色器,转换GDI +图像以在DirectX中用作纹理

3)在DirectX中绘制4个顶点并将照片用作纹理

4)应用像素着色器

5)使用像素着色照片保存曲面

1-4已经解决,但我如何实现第5步?

目前我正在使用以下代码段来收集修改后的照片:

d3dDevice->GetRenderTarget(0, &surface);

D3DXSaveSurfaceToFile("Test.png", D3DXIFF_PNG, surface, NULL, NULL);

surface->Release();
surface = NULL;

此代码不符合我的需要,因为它捕获整个场景而不仅仅是纹理(=照片)。如何才能获得原始尺寸的像素着色照片纹理?我想获得与Shazzam Tool相同的结果,但没有WPF ...

提前谢谢!

干杯!

2 个答案:

答案 0 :(得分:1)

我只是创建一个具有适当尺寸的屏幕外渲染目标(渲染到纹理)并将其保存为曲面(就像您已经做过的那样)。渲染到可见的屏幕空间(听起来就像你现在正在做的那样)绝对是你最有可能避免的事情。如果您还想显示结果,请渲染渲染的纹理。

答案 1 :(得分:0)

这是一个古老的问题,但是弓箭有Direct2D效果可以满足您的需求。

https://docs.microsoft.com/en-us/windows/win32/direct2d/built-in-effects