c++ (Direct2D) 中的混合模式

Blending modes in c++ (Direct2D)

本文关键字:混合 模式 Direct2D c++      更新时间:2023-10-16

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

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

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

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

谢谢

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

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

2-纯粹的软件操作会非常慢,除非它是一次性操作。但是,如果您尝试进行着色或照明,则软件渲染是不可能的。这也在很大程度上取决于图像的数量和每个图像的大小。我的意思是,如果你在每帧16x16的微小图像上做到这一点,这是可能的。但是,如果您谈论的是每帧 128x128,这将很多,特别是因为操作内存图形涉及锁和关键部分,因此这是一个耗时的过程。

3-这在很大程度上取决于您使用的DX版本以及您的工作方式,但请查看MSDN在DirectX上的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 }

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

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