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) 多边形, 而且要按照由远及近的深度
顺序, 这是由于事实上按照不同的顺序混合两个(1和2)多边形会得到不同的结果。 假如多边形1距离我们最近, 那么正确的方法是先
绘制多边形2, 然后是多边形1。 如果你看着它, 那么真实情况就是它们后面的光首先经过多边形2, 然后经过多边形1, 最后到
达你的眼睛。 所以, 你需要按照深度将透明的多边形进行排序, 开着深度缓存并在整个场景绘制完毕之后再绘制它们, 否则将得
到不正确的结果。 我知道这有时候是令人头痛的问题, 但这是正确的方法。
----------------------------------------------------------
我将的我代码重要的一部分放到这里
这里一定要开始就将场景就绘制好,然后才能谈这样那样的混合。绘制混合物体时一定要先绘远的物体,再绘近的物体。
示例程序:
作者:OUZI(connoryan)
出处:http://www.cnblogs.com/ouzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。