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

3

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

  1. 在这种情况下,是否有任何方法可以在没有Effects类的情况下重新创建混合模式(硬光)并仍保持硬件加速。

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

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

谢谢

1个回答

2
首先,您使用的是哪个版本的DirectX?
1- 您可以编写自己的着色器并更改渲染管道以使用您的着色器,但如果您以前从未这样做过,这可能需要很多工作。 此链接讨论了DX11中的渲染管道,此链接则讨论了DX9中的渲染管道。 如果您正在使用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 }

这段话的意思是,使用采样器从每个图像中取样一个给定的像素。然后计算两个像素值之间的平均值,并返回结果。此外,还提到了一个关于像素着色器的文章,请参考pixel shaders

我想仍然使用DX 10.1或更高版本。我对DX还很陌生,所以您能否请先展示一下如何编写自己的着色器的基本概述?我可以编写自己的着色器并在DX渲染目标中应用该过程,然后将其转换为位图并带回D2D渲染目标吗? - Mathew Kurian
我不想失礼,但编写着色器和能够使用它们的架构对于初学者来说有点困难。我建议先阅读一些相关文章并尝试一下。我可以发布代码,但我觉得这样做没有任何实际价值。 - Will Custode
使用这种方法可以创建位图,并使用Direct2D渲染最终位图吗? - Mathew Kurian
1
是的,虽然我不知道如何立即做到这一点。但您可以通过着色器管线运行内容,我相信您可以将其渲染到离屏目标并将该目标保存为位图。 - Will Custode

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