c++ (Direct2D) 中的混合模式
Blending modes in c++ (Direct2D)
我正在尝试使用Direct2D混合两个图像,但是只有最新的Direct2D支持效果,因此支持混合选项。但由于兼容性问题,我想避免使用最新版本。
-
话虽如此,有没有办法在没有效果类的 Direct2D 中重新创建混合模式(硬光(,并且仍然保持硬件加速。
-
如果不是,纯软件端渲染会对性能产生不利影响吗?
-
如何访问 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 }
这个想法是使用采样器从每个图像中采样给定像素。然后,您只需平均两者之间的值并返回结果。
另请查看这篇关于像素着色器的文章。
相关文章:
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 混合模式程序集是针对版本 'v2.0.50727' 构建的 ...本机C++/Visual C++/C# 项目错误
- Visual Studio混合模式调试是否可以附加到Jupyter笔记本以同时调试C++和Python
- 如何链接到C++/Cli混合模式dll中的本机类
- 调试混合模式应用程序(C# 和非托管 C++)时"The breakpoint will not currently be hit"错误
- 混合模式程序集(C++/CLI项目)在.NET Core上工作吗
- 如何处理混合模式项目中的打印
- c++ (Direct2D) 中的混合模式
- 链接到混合模式dll中的presentationcore.dll
- 通过混合模式c++ /CLI DLL从ETL工具中使用托管c# DLL -可能
- 内存管理在c++混合模式下的应用
- 如何将使用boost::asio的本地c++静态库导入CLI/ c++混合模式应用程序?
- 卸载混合模式组件
- 从混合模式c++项目中的CLR-to-SEH异常中获取明智的信息
- 用于混合模式项目的内存泄漏检测:托管、非托管和本机
- 在新托管线程中通过 C# 在混合模式程序集中调用 STL 矢量的push_back
- 正在尝试转换混合模式的公式
- 正在尝试转换混合模式的公式
- VS2010 中使用 .NET 3.5 的混合模式调试
- 使用本机C++、托管 C++ CLI 和 C# 解决方案在混合模式下进行调试