Unity3D教程宝典之Shader篇:第十三讲 Alpha混合

转载自风宇冲Unity3D教程学院

Alpha Blending,中文译作Alpha混合

Blending就是控制透明的。处于光栅化的最后阶段。

这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标。

语法

Blend Off     不混合

Blend SrcFactor DstFactor  SrcFactor是源系数,DstFactor是目标系数

最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数)

属性(往SrcFactor,DstFactor 上填的值)

one                                1

zero                               0

SrcColor                         源的RGB值,例如(0.5,0.4,1)

SrcAlpha                         源的A值, 例如0.6

DstColor                         混合目标的RGB值例如(0.5,0.4,1)

DstAlpha                         混合目标的A值例如0.6

OneMinusSrcColor           (1,1,1) - SrcColor

OneMinusSrcAlpha           1- SrcAlpha

OneMinusDstColor           (1,1,1) - DstColor

OneMinusDstAlpha          1- DstAlpha

运算法则示例:

(注:r,g,b,a,x,y,z取值范围为[0,1])

(r,g,b) * a = (r*a , g*a , b*a)

(r,g,b) * (x,y,z) = (r*x , g*y , b*z)

(r,g,b) + (x,y,z) = (r+x , g+y , b+z)

(r,g,b) - (x,y,z)  = (r-x , g-y , b-z)

在树叶使用的Shader中添加Blend代码

Blend zero one:仅显示背景的RGB部分,无Alpha透明通道处理。

Blend one  zero:  仅显示贴图的RGB部分,无Alpha透明通道处理。 A通道为0即本应该透明的地方也渲染出来了。

Blend one  one:贴图和背景叠加,无Alpha透明通道处理。仅仅是颜色rgb数值的叠加更趋近于白色即(1,1,1)了。

Blend SrcAlpha  zero:仅仅显示贴图,贴图含Alpha透明通道处理。但是贴图中的透明部分,即下图黑色部分没有颜色来显示,因为源颜色乘以alpha值0,为0;而混合目标的颜色乘以zero 0,也是0。所以透明部分显示的颜色为(0,0,0)

 

 

Blend SrcAlpha  OneMinusSrcAlpha:

最终颜色 = 源颜色 * 源透明值 + 目标颜色*(1 - 源透明值)

最常用的透明混合方式。贴图alpha值高的部分,显示得实,而混合的背景很淡。而alpha值高的部分,贴图显示得淡,而背景现实得实。

举例:

(1)假设贴图有一个不透明红色点, Color(1,0,0,1),该点背景色为不透明蓝色 Color(0,0,1,1)

最终颜色 =  (1,0,0)* 1+(0,0,1)*(1-1) = (1,0,0)

结论一:贴图alpha值为1时,仅显示贴图,不显示背景

(2)假设贴图有一个透明红色点, Color(1,0,0,0),该点背景色为透明,但B通道值为1,即Color(0,0,1,0)

最终颜色 =  (1,0,0)* 0+(0,0,1)*(1-0) = (0,0,1)

结论二:贴图alpha值为0时,仅显示混合目标即背景,不显示贴图

但是目标alpha值为0,即其实这个点的背景是透明的,而我们却把它显示出来了,这就不对了。

经验:带A通道的贴图中,空的地方不只A值为0,RGB值也要为0,不然容易出错。

(3)假设贴图有一个半透明红色点, Color(1,0,0,0.8),该点背景色为不透明蓝色 Color(0,0,1,1)

最终颜色 =  (1,0,0)* 0.8+(0,0,1)*(1-0.8) = (0.8,0,0.2)

而假如0.8变为0.2时,

最终颜色 =  (1,0,0)* 0.2+(0,0,1)*(1-0.2) = (0.2,0,0.8)

结论:贴图alpha值越大,颜色越偏向贴图;alpha值越小,颜色越偏向混合目标

Blend组合的情况就先讲这么多了,更多的组合需要自己去试去用,现在请再回过头看看第五讲的引言,是不是有一种恍然大悟的感觉呢?

时间: 2024-08-25 12:06:28

Unity3D教程宝典之Shader篇:第十三讲 Alpha混合的相关文章

Unity3D教程宝典之Shader篇:第三讲Vertex&Fragment Shader

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Vertex and Fragment Shader:最强大的Shader类型,也是本系列的重点,下文中简称V&F Shader,属于可编程渲染管线. 使用的是CG/HLSL语法.分为2个部分vertex顶点部分和Fragment像素部分.下面依然通过写几个简单的Shader来学习. 例一:显示一张贴图 新建Unity工程,新建一个Cube立方体,新建一个名为Exam1的Shader(Project视图->Create->Sh

Unity3D教程宝典之Shader篇:第十六讲自定义光照模型

转载自风宇冲Unity3D教程学院   十四讲我们实现了基本的Surface Shader,十五讲讲了光照模型的基础知识.这一讲说的是如何写光照模型. 自定义光照模型主要分为4步: (0)架设框架,填写需要的参数 (1)计算漫反射强度 (2)计算镜面反射强度 (3)结合漫反射光与镜面反射光 代码配有中文注释,配合上上讲的光照公式,一步一步实现即可. //Author: 风宇冲 Shader "Custom/T_customLightModel" { Properties { _Main

Unity3D教程宝典之Shader篇:第十二讲 Alpha测试

转载自风宇冲Unity3D教程学院 引言:本讲和下一讲主要讲Alpha即透明通道有关的内容.RGBA,其中最终在屏幕上显示的只有RGB即 红绿蓝组成的颜色,Alpha并没有任何颜色显示.A只是辅助颜色运算特别是多图层运算而已.例如在单图层的情况下(1,1,1,0.8)输出的是(1,1,1)*0.8即 浅灰色(0.8,0.8,0.8),和(0.8,0.8,0.8)是等价的.但是假如不再是单图层而背景为绿色(0,1,0,1)的时候,(0.8,0.8,0.8)就不知道怎么去运算了,而(1,1,1,0.

Unity3D教程宝典之Shader篇:第十讲 雾化

转载自风宇冲Unity3D教程学院 Fog,即雾化.本质是离屏幕越远的物体,就越趋向于某种颜色.通常是远处,即离屏幕远的地方,趋向于白色或者浅灰色. 全局雾化: 在Edit->RenderSettings里设置,具体如下 Fog: 激活或不激活Fog Color:雾的颜色,仅RGB起作用. Fog Mode: Linear线性,Exp指数,Exp2 指数2 Fog Density:雾化的强度 Linear Fog Start:开始距离 Linear Fog End:结束距离 部分雾化: 三种Sh

Unity3D教程宝典之Shader篇:第十五讲 光照基础

转载自风宇冲Unity3D教程学院 简单的说,带光照的Shader的最终颜色输出为 材质颜色 * 光颜色,其中 材质颜色:之前已经提到过,固定格式tex2D (_MainTex, i.uv) 光颜色:光颜色 = 自发光 + 环境光 + 漫反射光 + 镜面光 下面详细讲解这四种光 一:自发光 由物体表面向四面八方发出的光 emissive = colorEmissive colorEmissive 自发光的颜色 二:环境光 物体表面接收的来自四面八方发出的光, 然后向四面八方反射 ambient

Unity3D教程宝典之Shader篇:第十四讲Surface Shader

转载自风宇冲Unity3D教程学院 用Shader来实现光照是比较复杂的,有不同的光类型,不同的阴影选项,不同的Render Path(forward和Deferred). Unity只是把光照模型封装处理了,Shader的代码还是用CG/HLSL编写的. 例一:最简单的Surface Shader Shader "Custom/T_3_0" { Properties { _MainTex ("Base (RGB)", 2D) = "white"

Unity3D教程宝典之Shader篇:第二十讲法线贴图

转载自风宇冲Unity3D教程学院 上一讲我们讲了凹凸贴图以及生成法线贴图. 这一讲来谈谈怎么使用法线贴图. 一:法线贴图的原理 二:法线贴图的实现 三:法线贴图的使用 四:法线贴图的格式 一:法线贴图的原理 光照效果很大程度上是由垂直于物体表面的法线决定的,因为法线影响反射光的方向.均匀垂直的法线是镜面贴图.但是有时候我们会给一个平面使用砖墙贴图,砖墙应该是凹凸不平的,而如果让砖墙使用该平面的法线的话,画面就会很假,神马?一面墙像镜子一样反光=.= 而如果按真实砖墙去做模型的话,即做高精度模型

Unity3D教程宝典之Shader篇:第二十四讲Reflection Mapping

转载自风宇冲Unity3D教程学院 简介 Reflection Mapping,又叫Environment Mapping.对应TexGen的SphereMap和CubeReflect.是最快的reflect周围环境的算法 最早出现的是Sphere Mapping,之后被Cube Mapping取代.Reflection Mapping比射线追踪(Ray Tracing)高效得多 Reflection Mapping的前提是2个假设 (1)入射线来自无限距离 (2)物体是凸的,没有自身的相互反射

Unity3D教程宝典之Shader篇:第二十六讲ImageEffects_Twirl

转载自风宇冲Unity3D教程学院 Twirl是一个全屏画面扭曲的效果,新仙剑的战斗切换有用到这个效果. 主要有三个设置: center  扭曲的中心点 radius 扭曲的范围 angle 扭曲的角度 用到了如下函数 Matrix4x4.TRS(Vector3 pos, Quaternion rotate,Vector3 scale) 创建一个包括位移,旋转,缩放的矩阵 Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, Quatern