2013-01-03 28 views
0

我有一些使用System.Drawing.SolidBrush绘制半透明三角形的GDI代码。我正在尝试使用适当的3D渲染API(OpenGL/Direct3D11)重新实现代码,但我不确定什么混合公式用于这些三角形以获得与原始GDI代码相同的输出。 (func = GL_FUNC_ADD,eq = GL_ONE,GL_ONE)或插值(func = GL_FUNC_ADD,eq = GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA),但这两个看起来都不太对。这几乎可以肯定是我新代码中的一个错误,但我想确保在继续之前我正在朝着正确的目标努力。有人知道合适的混合方程吗?什么混合方程是System.Drawing.SolidBrush使用?

编辑:这是有关C#代码,剥离语境:

using System.Drawing; 
SolidBrush b = new SolidBrush(Color.FromArgb(alpha,red,green,blue)); 
Point[] points = ...; 
Graphics g; 
g.FillPolygon(b,points); 

我的问题是,什么颜色实际上将被写入,在刷的RGBA和目的地像素的RGBA的条款?我可以找到的所有文档都只是说“使用alpha来控制Brush的透明度”或者其他同样模糊的内容;我很好奇实际的混合方程是什么。

+0

什么是你试图重新实现的“GDI代码”? –

+0

这是一些来自远期同事的图像处理代码,我试图恢复并整合到一个新的非GDI项目中。具体细节是专有的,但与问题无关。但是,如果有帮助,我已经添加了相关代码的一部分。 – postgoodism

回答

0

根据MSDN,System.Drawing.Graphics具有名为CompositingMode的属性,其可以是SourceOverSourceCopy

默认一个是SourceOver,其

指定当颜色被渲染,这是混有背景色。混合由正在渲染的颜色的alpha分量决定。

正如我已经测试,这里使用的混合策略是alpha composition,其由下面的等式在图像B确定在区域图像A中的像素值:

Alpha composition equation

这里α a和α b是图像A和图像B的标准化α值; C a和C b是图像A和图像B的RGBA值; C o是输出图像的RGBA值。

相关问题