3

我正在尝试使用 Direct2D 混合两个图像,但是只有最新的 Direct2D 支持效果,因此支持混合选项。但由于兼容性问题,我想避免使用最新版本。

  1. 话虽如此,有没有办法在 Direct2D 中重新创建没有效果类的混合模式(硬光)并仍然保持硬件加速。

  2. 如果不是,纯粹的软件端渲染会对性能产生不利影响吗?

  3. 如何访问 D2D 中的像素并逐个像素地进行操作?

谢谢

4

1 回答 1

2

首先,您使用的是哪个版本的 DirectX?

1-您可以编写自己的着色器并更改渲染管道以使用您的着色器,但如果您以前从未这样做过,这可能需要做很多工作。此链接讨论了 DX11 中的渲染管道,并且此链接讨论了 DX 9中的内容。如果您在 DX9 中工作,请查看此内容

2- 纯软件操作会非常缓慢,除非它是一次性操作。但是,如果您要进行着色或照明,则软件渲染是不可能的。这也很大程度上取决于图像的数量和每个图像的大小。我的意思是,如果您在每帧 16x16 的微小图像上进行此操作,那将是可能的。但是,如果您谈论的是每帧 128x128,这将会很多,尤其是因为处理内存中的图形涉及锁定和临界区,所以这是一个耗时的过程。

3- 这在很大程度上取决于您使用的 DX 版本以及处理方式,但请查看有关 DirectX 的 MSDN API 参考文章。我保证通过谷歌搜索你可以找到这个。

根据您的要求,这里是像素着色器的伪代码,可以混合两个图像:

// shader file start
sampler2D firstImage
sampler2D secondImage

PS_OUTPUT EvenBlendPixelShader( float4 position : POSITION0, float4 color : COLOR )
    float4 firstSample = firstImage( position )
    float4 secondSample = secondImage( position )
    float4 output = 0;
    output.x = (firstSample.x + secondSample.x) / 2;
    output.y = (firstSample.y + secondSample.y) / 2;
    output.z = (firstSample.z + secondSample.z) / 2;
    output.w = (firstSample.w + secondSample.w) / 2;
    return { position, output }

这个想法是您使用采样器从每个图像中采样给定像素。然后,您只需平均两者之间的值并返回结果。

另请查看有关像素着色器的这篇文章。

于 2013-09-24T15:13:52.197 回答