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

时间:2013-09-24 14:53:38

标签: c++ c directx direct2d

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

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

  2. 如果没有,纯粹的软件方面会不会对性能产生负面影响?

  3. 如何访问D2D中的像素并逐像素处理?

  4. 谢谢

1 个答案:

答案 0 :(得分:2)

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

1-您可以编写自己的着色器并更改渲染管道以使用着色器,但如果您以前从未这样做过,这可能会有很多工作。 This link讨论DX11中的渲染管道,this link在DX 9中讨论它。Look at this if you're working in 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上的这篇文章。