当前位置:   article > 正文

shader Blend混合模式讲解

shader blend

内容说明:

         1.混合(blend)说明

         2.在OpenGL中的使用

         3. Unity中的使用

 

1. 什么是混合

         混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。

假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
 

2. 在OpenGL中使用Blend

2.1 初始化说明

         要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。

         要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。

注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。

         混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。

2.2 公式说明

数学公式来表达一下这个运算方式。

假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是 (Rs, Gs, Bs, As),

目标颜色的四个分量是(Rd, Gd, Bd, Ad),

又设源因子为(Sr, Sg, Sb, Sa),

目标因子为 (Dr, Dg, Db, Da)。

则混合产生的新颜色可以表示为:

  

(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db,  As*Sa+Ad*Da)

  

如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题

2.3 在OpenGL中的使用

选择源混合因子和目标混合因子的方式:

第一种方式是调用函数glBlendFunc(),并指定两个混合因子, 其中第一个参数为源RGBA的混合因子, 第二个参数为目标RGBA的混合因子.

第二种方法是调用glBlendFuncSeparate()并指定4个混合因子, 这样可以用不同的方式来混合RGB和alpha值

         第二种方式就不在说了,说下第一种当时中的混合因子的枚举表:

  

GL_DST_ALPHA

  
  

( Ad , Ad , Ad , Ad )

  
  

GL_DST_COLOR

  
  

( Rd , Gd , Bd , Ad )

  
  

GL_ONE

  
  

(1,1,1,1)

  
  

GL_ONE_MINUS_DST_ALPHA

  
  

(1,1,1,1) - (Ad,Ad,Ad,Ad)

  
  

GL_ONE_MINUS_DST_COLOR

  
  

(1,1,1,1) - (Rd,Gd,Bd,Ad)

  
  

GL_ONE_MINUS_SRC_ALPHA

  
  

(1,1,1,1) - (As,As,As,As)

  
  

GL_SRC_ALPHA

  
  

( As , As , As , As )

  
  

GL_SRC_ALPHA_SATURATE

  
  

(f,f,f,1) : f = min(As,1-Ad)

  
  

GL_ZERO

  
  

( 0 , 0 , 0 , 0 )

  
 

3. unity中的说明

3.1 unity中混合简介

         混合常用在透明物体渲染中。如下图说明:

PipelineBlend.png (26.19 KB, 下载次数: 49)

下载附件  保存到相册

2016-11-16 17:29 上传

 

在所有着色器执行完毕,所有纹理都被应用,所有像素准备被呈现到屏幕之后,使用Blend命令来操作这些像素进行混合。

3.2 blend的语法

         BlendOff:关闭blend混合(默认值)

         BlendSrcFactor DstFactor :配置并启动混合。产生的颜色被乘以SrcFactor. 已存在于屏幕的颜色乘以DstFactor,并且两者将被叠加在一起。

         BlendSrcFactor DstFactor, SrcFactorA DstFactorA:同上,但是使用不同的要素来混合alpha通道

         BlendOpBlendOpValue:不是添加混合颜色在一起,而是对它们做不同的操作。

         BlendOpOpColor, OpAlpha:同上,但是使用不同的操作来处理alpha通道

         AlphaToMaskOn:里面新添加的,常用在开启多重渲染(MSAA)的地表植被的渲染。

 

Unity中的混合因子(和OpenGL的差不多):

  

One

  

值为1,使用此设置来让源或是目标颜色完全的通过。

Zero

值为0,使用此设置来删除源或目标值。

SrcColor

此阶段的值是乘以源颜色的值。

SrcAlpha

此阶段的值是乘以源alpha的值。

DstColor

此阶段的值是乘以帧缓冲区源颜色的值。

DstAlpha

此阶段的值是乘以帧缓冲区源alpha的值。

OneMinusSrcColor

此阶段的值是乘以(1 - source color)

OneMinusSrcAlpha

此阶段的值是乘以(1 - source alpha)

OneMinusDstColor

此阶段的值是乘以(1 - destination color)

OneMinusDstAlpha

此阶段的值是乘以(1 - destination alpha)

 

混合的操作符(Blend operations)

  

Add

  

Add source and destination together.

Sub

Subtract destination from source.

RevSub

Subtract source from destination.

Min

Use the smaller of source and  destination.

Max

Use the larger of source and destination.

LogicalClear

Logical operation: Clear (0) DX11.1  only.

LogicalSet

Logical operation: Set (1) DX11.1  only.

LogicalCopy

Logical operation: Copy (s) DX11.1  only.

LogicalCopyInverted

Logical operation: Copy inverted  (!s) DX11.1 only.

LogicalNoop

Logical operation: Noop (d) DX11.1  only.

LogicalInvert

Logical operation: Invert  (!d) DX11.1 only.

LogicalAnd

Logical operation: And (s &  d) DX11.1 only.

LogicalNand

Logical operation: Nand !(s &  d) DX11.1 only.

LogicalOr

Logical operation: Or (s | d) DX11.1  only.

LogicalNor

Logical operation: Nor !(s | d) DX11.1  only.

LogicalXor

Logical operation: Xor (s ^  d) DX11.1 only.

LogicalEquiv

Logical operation: Equivalence !(s ^  d) DX11.1 only.

LogicalAndReverse

Logical operation: Reverse And (s &  !d) DX11.1 only.

LogicalAndInverted

Logical operation: Inverted And (!s &  d) DX11.1 only.

LogicalOrReverse

Logical operation: Reverse Or (s |  !d) DX11.1 only.

LogicalOrInverted

Logical operation: Inverted Or (!s |  d) DX11.1 only

 

下列是最经常使用的混合类型

Blend SrcAlpha OneMinusSrcAlpha // Alphablending alpha混合

Blend One One // Additive 相加混合

Blend One OneMinusDstColor // Soft Additive柔和相加混合

Blend DstColor Zero // Multiplicative 相乘混合

BlendDstColor SrcColor // 2x Multiplicative 2倍相乘混合
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/96638
推荐阅读
相关标签
  

闽ICP备14008679号