ManagedDirectX--Alpha混合

前言

================================================

就现在来说,不停地讲ManagedDirectX总感觉有一点不合潮流, 看别人那么多人紧随微软的脚步,什么WPF啦的

大堆,我还在这里说什么几万年前就被淘汰的东西,总觉得有一点不合群,但还是我的观点,一切够用,能够满足

我当前的需求也就够了,说到这里我也多说一句,象WPF我也学过,但是对我们的项目而言,它现在的表现比较

差,不能够满足我们项目的需求,就放弃了,改用了GDI+。所以我想我这个人是不可能成为一个什么技术专家的

了。

================================================

 

Alpha混合说到底就是为了透明的3D效果而存在的,这种混合就是将屏幕上已有的颜色和新的颜色进行混合,达到

一种新的显示效果,混合的最终效果受物体颜色和混合方式影响,在Directx中有很多种的混合方式,帮助文件中有

大家自己看一下就可以非常的清楚,我这里用到的是常用的方式

                device.RenderState.SourceBlend = Blend.SourceAlpha;

                device.RenderState.DestinationBlend = Blend.InvSourceAlpha;

 

下面说一下混合后的颜色值是怎么算来的:

 屏幕上已有的颜色S(SA,SR,SG,SB)

新的颜色D(DA,DR,DG,DB)

经过混合后屏幕最终显示的颜色就是:

c=SA/255*SA+(1-SA)/255*DA     其它三种颜色也是这样算出来的,当c>255时系统自动取模

如果你用的混合方式不同,当然上面的公式也就有一点不同,就是SA/255与(1-SA/255)这里的不同。

 是不是这种算法很简单,其实不要一看到那一长串的混合模式就给吓到了,呵呵。

 

 Alpha混合还要搞清楚是谁和谁混合,谁是屏幕上已有的颜色,什么又是新的颜色,这里就要注意了,这里有一位大师

讲的非常 的清楚了,我COPY到这里:

------------------------------------------------------

 首先我们得打开混合, 然后设置混合式。 在绘制透明物体的时候, 我们关闭深度缓存, 因为我们仍然希望在半透明物体后面

的物体能被绘制。 这并不是使用混合的正确方式, 但是在情况简单的时候它会工作得很好。

Rui Martins 补充: 正确的方法是在整个场景绘制完之后再绘制所有的透明 (alpha < 1.0) 多边形, 而且要按照由远及近的深度

顺序, 这是由于事实上按照不同的顺序混合两个(12)多边形会得到不同的结果。 假如多边形1距离我们最近, 那么正确的方法是先

绘制多边形2 然后是多边形1 如果你看着它, 那么真实情况就是它们后面的光首先经过多边形2 然后经过多边形1 最后到

达你的眼睛。 所以, 你需要按照深度将透明的多边形进行排序, 开着深度缓存并在整个场景绘制完毕之后再绘制它们, 否则将得

到不正确的结果。 我知道这有时候是令人头痛的问题, 但这是正确的方法。

 ----------------------------------------------------------


 我将的我代码重要的一部分放到这里

Code

 

这里一定要开始就将场景就绘制好,然后才能谈这样那样的混合。绘制混合物体时一定要先绘远的物体,再绘近的物体。

 

 

示例程序:

https://files.cnblogs.com/ouzi/ManagedX/FreeBlending01.rar

posted @ 2008-08-31 20:48  connoryan  阅读(1803)  评论(5编辑  收藏  举报