我正在尝试使用Direct2D混合两个图像,但只有最新的Direct2D支持效果,因此混合选项。但由于兼容性问题,我想避免使用最新版本。
话虽如此,有没有办法在没有Effects类的Direct2D中重新创建混合模式(hard-light),并且仍然保持硬件加速。
如果没有,纯粹的软件方面会不会对性能产生负面影响?
如何访问D2D中的像素并逐像素处理?
谢谢
答案 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上的这篇文章。