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倍相乘混合
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用VTK 9.2版本的imageBlend混合式的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkImageBlend.h> #include <vtkImageData.h> #include <vtkPNGReader.h> #include <vtkPNG.h> int main() { // 读取第一张图像 vtkSmartPointer<vtkPNGReader> reader1 = vtkSmartPointer<vtkPNGReader>::New(); reader1->SetFileName("image1.png"); reader1->Update(); vtkSmartPointer<vtkImageData> image1 = vtkSmartPointer<vtkImageData>::New(); image1->ShallowCopy(reader1->GetOutput()); // 读取第二张图像 vtkSmartPointer<vtkPNGReader> reader2 = vtkSmartPointer<vtkPNGReader>::New(); reader2->SetFileName("image2.png"); reader2->Update(); vtkSmartPointer<vtkImageData> image2 = vtkSmartPointer<vtkImageData>::New(); image2->ShallowCopy(reader2->GetOutput()); // 创建一个图像混合器 vtkSmartPointer<vtkImageBlend> blend = vtkSmartPointer<vtkImageBlend>::New(); blend->AddInputData(image1); blend->AddInputData(image2); blend->SetOpacity(0, 0.5); // 设置第一张图像的不透明度为0.5 blend->SetOpacity(1, 0.5); // 设置第二张图像的不透明度为0.5 blend->Update(); // 将混合结果保存为新图像 vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New(); writer->SetFileName("blended_image.png"); writer->SetInputData(blend->GetOutput()); writer->Write(); return 0; } ``` 在上面的示例代码中,我们首先使用`vtkPNGReader`读取两张PNG格式的图像,然后使用`vtkImageBlend`进行图像混合。通过调整每张图像的不透明度,可以控制它们在混合结果中的贡献程度。最后,使用`vtkPNGWriter`将混合结果保存为新的PNG图像。 请注意,你需要替换代码中的`image1.png`、`image2.png`和`blended_image.png`为你自己的图像文件路径。此外,你还需要安装VTK 9.2版本并链接相应的库来编译和运行此代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值