Unity3D教程宝典之Shader篇:第十二讲 Alpha测试
- 格式:docx
- 大小:118.67 KB
- 文档页数:3
OpenGL中alpha测试GL_ALPHA_TEST2011-03-03 19:32 来自/lpt19832003/archive/2009/06/25/4297333.aspx我们知道像素的Alpha值可以用于混合操作。
其实Alpha值还有一个用途,这就是Alpha测试。
当每个像素即将绘制时,如值,只有Alpha值满足条件的像素才会进行绘制(严格的说,满足条件的像素会通过本项测试,进行下一种测试,只有所有测试都这个“条件”可以是:始终通过(默认情况)、始终不通过、大于设定值则通过、小于设定值则通过、等于设定值则通过、大于等于值则通过。
如果我们需要绘制一幅图片,而这幅图片的某些部分又是透明的(想象一下,你先绘制一幅相片,然后绘制一个相框,则相框这幅到下面的照片),这时可以使用Alpha测试。
将图片中所有需要透明的地方的Alpha值设置为0.0,不需要透明的地方Alpha值设0.5则通过”,这样便能达到目的。
当然也可以设置需要透明的地方Alpha值为1.0,不需要透明的地方Alpha值设置为0.0,然后往往不只一种,可以根据个人喜好和实际情况需要进行选择。
可以通过下面的代码来启用或禁用Alpha测试:glEnable(GL_ALPHA_TEST); // 启用Alpha测试glDisable(GL_ALPHA_TEST); // 禁用Alpha测试可以通过下面的代码来设置Alpha测试条件为“大于0.5则通过”:glAlphaFunc(GL_GREATER, 0.5f);该函数的第二个参数表示设定值,用于进行比较。
第一个参数是比较方式,除了GL_LESS(小于则通过)外,还可以选择:GL_ALWAYS(始终通过),GL_NEVER(始终不通过),GL_LESS(小于则通过),GL_LEQUAL(小于等于则通过),GL_EQUAL(等于则通过),GL_GEQUAL(大于等于则通过),GL_NOTEQUAL(不等于则通过)。
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院Shader第十三讲Alpha混合Alpha Blending,中文译作Alpha混合Blending就是控制透明的。
处于光栅化的最后阶段。
这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标。
语法Blend Off 不混合Blend SrcFactorDstFactor SrcFactor是源系数,DstFactor是目标系数最终颜色 = (Shader计算出的点颜色值* 源系数)+(点累积颜色* 目标系数)属性(往SrcFactor,DstFactor上填的值)one 1zero 0SrcColor 源的RGB值,例如(0.5,0.4,1)SrcAlpha 源的A值, 例如0.6DstColor 混合目标的RGB值例如(0.5,0.4,1)DstAlpha 混合目标的A值例如0.6OneMinusSrcColor (1,1,1) - SrcColorOneMinusSrcAlpha 1- SrcAlphaOneMinusDstColor (1,1,1) - DstColorOneMinusDstAlpha 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即本应该透明的地方也渲染出来了。
unity alphablend的原理Unity是一款非常流行的游戏开发引擎,它提供了丰富的功能和工具来帮助开发者创建出精美的游戏。
在Unity中,Alpha Blend是一个常用的渲染技术,它可以实现透明效果。
那么,什么是Alpha Blend的原理呢?Alpha Blend是一种图像合成技术,它通过调整像素的透明度来实现不同图像的叠加效果。
在Unity中,每个像素都有RGBA四个分量,其中A代表透明度。
透明度的取值范围是0到1,0代表完全透明,1代表完全不透明。
在Alpha Blend中,通过将不同图像的像素按照一定的权重进行叠加,从而实现透明效果。
具体来说,对于两个像素的叠加,可以使用以下公式:Result = Source * SourceAlpha + Destination * (1 - SourceAlpha)其中,Source表示当前像素的颜色值,SourceAlpha表示当前像素的透明度,Destination表示目标像素的颜色值。
通过这个公式,可以根据两个像素的透明度来计算最终的颜色值。
在Unity中,Alpha Blend的原理是基于混合模式来实现的。
混合模式定义了不同像素之间的混合方式,包括源因子和目标因子。
源因子决定了当前像素的颜色如何影响目标像素,而目标因子则决定了目标像素的颜色如何影响当前像素。
常用的混合模式有以下几种:- Alpha Blend:使用源因子和目标因子进行线性插值,实现透明效果。
- Additive:将源像素的颜色和目标像素的颜色相加,用于实现光照效果或粒子效果。
- Multiply:将源像素的颜色和目标像素的颜色相乘,用于实现阴影效果或颜色叠加效果。
在Unity中,可以通过在材质上设置相应的混合模式来实现不同的渲染效果。
在Shader中,可以使用Blend命令来指定混合模式,例如:Blend SrcAlpha OneMinusSrcAlpha这个命令表示使用Alpha Blend混合模式,其中源因子为源像素的透明度,目标因子为1减去源像素的透明度。
(原创实用版3篇)编制人员:_______________审核人员:_______________审批人员:_______________编制单位:_______________编制时间:____年___月___日序言下面是本店铺为大家精心编写的3篇《unity shader常用方法》,供大家借鉴与参考。
下载后,可根据实际需要进行调整和使用,希望能够帮助到大家,谢射!(3篇)《unity shader常用方法》篇1Unity 中 Shader 的使用可以通过编写着色器来实现,着色器分为顶点着色器和片元着色器两种。
顶点着色器主要用于处理模型的顶点信息,如位置、颜色、纹理坐标等,而片元着色器则主要用于处理模型的像素信息,如光照、阴影、透明、反射等。
通过编写 Shader,我们可以实现各种特效,例如镜面反射、水面、塑料等特殊材质。
同时,Shader 也可以方便地设置渲染状态,如混合函数、深度写入等。
在 Unity 中,我们可以将编写好的着色器打包成材质,然后将材质赋予合适的游戏对象,从而实现我们所需的渲染效果。
Shader 的编写语言为 HLSL 和 GLSL,其中 HLSL 是 Microsoft 推出的标准语言,而 GLSL 则是 OpenGL 的标准语言。
在 Unity 中,我们可以使用这两种语言中的任意一种来编写着色器。
此外,Unity 还提供了 ShaderLab 语言,它是一种类似于 HLSL 的语言,专门用于编写 Unity 中的着色器。
《unity shader常用方法》篇2Unity 中的 Shader 是一种用于控制 GPU 渲染流水线的高度可编程的阶段,可以通过编写着色器和设置渲染状态来实现各种渲染效果。
下面列举了一些Unity 中常用的 Shader 方法和技巧:1. 基本 Shader 类型:Unity 中的 Shader 分为两种类型,分别是顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。
Shader "Faye/OutLightting"{Properties{_MainTex("Texture (RGB)", 2D) = "black" {}_Color("Color", Color) = (0, 0, 0, 1)_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1) _Size("Size", Float) = 0.1_Falloff("Falloff", Float) = 5_FalloffPlanet("Falloff Planet", Float) = 5_Transparency("Transparency", Float) = 15_TransparencyPlanet("Transparency Planet", Float) = 1}SubShader{Pass{Name "PlanetBase"Tags {"LightMode" = "Always"}Cull BackCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma fragmentoption ARB_fog_exp2#pragma fragmentoption ARB_precision_hint_fastest#include "UnityCG.cginc"uniform sampler2D _MainTex;uniform float4 _MainTex_ST;uniform float4 _Color;uniform float4 _AtmoColor;uniform float _FalloffPlanet;uniform float _TransparencyPlanet;struct v2f{float4 pos : SV_POSITION;float3 normal : TEXCOORD0;float3 worldvertpos : TEXCOORD1;float2 texcoord : TEXCOORD2;v2f vert(appdata_base v){v2f o;o.pos = mul (UNITY_MA TRIX_MVP, v.vertex);o.normal = v.normal;o.worldvertpos = mul(_Object2World, v.vertex).xyz;o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}float4 frag(v2f i) : COLOR{i.normal = normalize(i.normal);float3 viewdir = normalize(_WorldSpaceCameraPos-i.worldvertpos);float4 atmo = _AtmoColor;atmo.a = pow(1.0-saturate(dot(viewdir, i.normal)), _FalloffPlanet);atmo.a *= _TransparencyPlanet*_Color;float4 color = tex2D(_MainTex, i.texcoord)*_Color;color.rgb = lerp(color.rgb, atmo.rgb, atmo.a);return color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal); }ENDCG}Pass{Name "AtmosphereBase"Tags {"LightMode" = "Always"}Cull FrontBlend SrcAlpha OneCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma fragmentoption ARB_fog_exp2#pragma fragmentoption ARB_precision_hint_fastest#include "UnityCG.cginc"uniform float4 _Color;uniform float4 _AtmoColor;uniform float _Size;uniform float _Falloff;uniform float _Transparency;struct v2f{float4 pos : SV_POSITION;float3 normal : TEXCOORD0;float3 worldvertpos : TEXCOORD1;};v2f vert(appdata_base v){v2f o;v.vertex.xyz += v.normal*_Size;o.pos = mul (UNITY_MA TRIX_MVP, v.vertex);o.normal = v.normal;o.worldvertpos = mul(_Object2World, v.vertex);return o;}float4 frag(v2f i) : COLOR{i.normal = normalize(i.normal);float3 viewdir = normalize(i.worldvertpos-_WorldSpaceCameraPos);float4 color = _AtmoColor;color.a = pow(saturate(dot(viewdir, i.normal)), _Falloff);color.a *= _Transparency*_Color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);return color;}ENDCG}}FallBack "Diffuse"}。
unity alphablend的原理Unity中的Alpha Blend(透明混合)是一种常用的图形渲染技术,它允许物体在绘制时具有部分透明效果。
在本文中,我们将深入探讨Unity中Alpha Blend的原理和实现方式。
让我们来了解一下Alpha值的概念。
在计算机图形中,Alpha值代表了像素的透明度或不透明度。
它是一个介于0到1之间的浮点数,其中0表示完全透明,1表示完全不透明。
通过调整Alpha值,我们可以控制物体的透明程度。
在Unity中,Alpha Blend是一种通过混合源像素和目标像素的颜色来实现透明效果的渲染技术。
具体来说,Alpha Blend使用了下面的公式来计算最终的颜色:Final Color = Source Color * Source Alpha + Destination Color * (1 - Source Alpha)其中,Source Color是源像素的颜色,Source Alpha是源像素的Alpha值,Destination Color是目标像素的颜色。
通过这个公式,我们可以看到,当Source Alpha为1时,即完全不透明时,Final Color就等于Source Color,也就是说,完全覆盖了目标像素的颜色。
而当Source Alpha为0时,即完全透明时,Final Color就等于Destination Color,也就是说,完全不影响目标像素的颜色。
在Alpha Blend中,我们还可以使用不同的混合模式来控制透明效果。
Unity中常用的混合模式有以下几种:1. Alpha Blend(标准透明混合):使用上述公式进行混合计算,适用于大多数透明效果。
2. Additive Blend(加法混合):将源像素的颜色和目标像素的颜色相加,适用于制作光效和火焰等发光效果。
3. Multiply Blend(乘法混合):将源像素的颜色和目标像素的颜色相乘,适用于制作阴影和颜色叠加效果。
Unity3DShader入门什么是ShaderShader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。
Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。
OpenGL的着色语言是GLSL,NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。
而Unity的Shader是将传统的图形接口的Shader(由Cg/HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。
Shader种类OpenGL和Direct3D都提供了三类着色器:顶点着色器:处理每个顶点,将顶点的空间位置投影在屏幕上,即计算顶点的二维坐标。
同时,它也负责顶点的深度缓冲(Z-Buffer)的计算。
顶点着色器可以掌控顶点的位置、颜色和纹理坐标等属性,但无法生成新的顶点。
顶点着色器的输出传递到流水线的下一步。
如果有之后定义了几何着色器,则几何着色器会处理顶点着色器的输出数据,否则,光栅化器继续流水线任务。
像素着色器(Direct3D),常常又称为片断着色器(OpenGL):处理来自光栅化器的数据。
光栅化器已经将多边形填满并通过流水线传送至像素着色器,后者逐像素计算颜色。
像素着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
名称片断着色器似乎更为准确,因为对于着色器的调用和屏幕上像素的显示并非一一对应。
举个例子,对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
几何着色器:可以从多边形网格中增删顶点。
它能够执行对CPU来说过于繁重的生成几何结构和增加模型细节的工作。
Direct3D版本10增加了支持几何着色器的API,成为ShaderModel4.0的组成部分。
OpenGL只可通过它的一个插件来使用几何着色器。
表面着色器(SurfaceShader)是Unity提出的一个概念。
Unity3D教程宝典之Shader篇Unity3D教程宝典之Shader篇:第一讲Shader总篇(2012-12-15 18:13:44)转载?标签: 分类: Unity3d之Shader篇unity3dunity3d教程编程游戏开发3d编程原创文章如需转载请注明:转载自风宇冲Unity3D教程学院引言,在Unity3d里,所有的图形绘制都必须通过Shader,即着色器。
一般的使用过程中,我们用到的都是unity自带的Shader,即build-in shader。
学习Shader后,自己写的Shader能做出很多你想要的特殊效果,增强游戏的画面表现。
例如水的倒影。
LOGO的光影闪过等等效果等等。
Shader的分类Shader按管线分类一般分为固定渲染管线与可编程渲染管线1)固定渲染管线——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控制和纹理混合。
T&L 管线可以被渲染状态控制,矩阵,光照和采制参数。
功能比较有限。
基本所有的显卡都能正常运行。
2)可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。
Unity3d的三种Shader Unity的Shader分为三种:(1)Fixed function shader 属于固定渲染管线 Shader, 基本用于高级Shader 在老显卡无法显示时的Fallback(之后有详细介绍)。
使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。
(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。
(3)Surface Shader Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。
Unity3D Built-in Shader,unity3d内置shader详解1Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象.首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。
传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。
(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)然后我们来看下Unity3D自带的60多个Shader。
这些Shader被分为五个大类:Norm al,Transparent,Transparent Cutout,Self-lllum inated,Reflective。
由于数量比较多,将分几个篇幅一一介绍。
(一) Norm al Shader Fam ily这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。
所以不会有任何基于像素渲染得效果,比如说:norm al mapping,light cookies和shadows.这个shader 对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。
基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。
如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。
(增加顶点数)总的来说,这个shader的渲染代价比较小。
这个shader包含了2个subshader,分别对应可编成管线和固定管线。
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院
特别讲:常见问题回答
本讲会陆续补充一些问题的解答。
问:
(1) TRANSFORM_TEX是做什么的
(2)float4 _MainTex_ST中的_MainTex_ST变量也没有用到,为啥非要声明一下?
答:简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算,确保材质球里的缩放和偏移设置是正确的。
(v.texcoord就是顶点的uv)
而_MainTex_ST的ST是应该是SamplerTexture的意思就是声明_MainTex是一张采样图,也就是会进行UV运算。
如果没有这句话,是不能进行TRANSFORM_TEX的运算的。
如果Tiling 和Offset你留的是默认值,即Tiling为(1,1)Offset为(0,0)的时候,可以不用
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0),但是如下图自己填的Tiling值和Offset值就不起作用了。
Unity3D培训学习路线之Shader前述此篇技术文档由蓝鸥科技Unity3D教学总监肖老师经验总结,现共享给各位Unity3D开发爱好者们,转载请注明出处。
5年的项目开发经验,在C、OC、C++、C#、PHP、Lua、SQL、HTML、JavaScipt等多种开发语言应用上游刃有余,曾主导开发过多个大型Unity3D游戏项目,关于Unity里面最令人关注的焦点就是着色器(Shader),这是个令人着迷、颇感兴趣的东西,在此分享给各位Unity开发爱好者,相信对想学Unity3D培训的人而言也是一个很好的起点。
什么是ShaderShader,也就是着色器,它的工作就是读取你的网格并渲染在屏幕上。
Shader可以定义一些属性,你会用它来影响渲染模型时所显示的效果。
当存储了这些属性的设置时,就是一个Material,材质。
Shader有以下几个种类:∙Surface Shaders ——也称为表面着色器。
这大概是Unity 的骄傲。
它去除了大部分“麻烦的工作”,可以适用于很多情况下∙Fragment Shaders ——片段着色器。
它允许你做更多的工作,但也更难写,而且它还让我们可以做低层的一些东西,像顶点光照,这对于移动设备和多个通道(passes)所必需的更高级的效果会非常有用。
Surface Shaders的代码需要看起来像这样:总结一下就是:首先需要定义一些Properties,然后将有一个或多个Subshaders。
使用的subshader将取决于所运行的平台。
除此之外,还应该指定一个Fallback Shader,如果你的subshaders都不可以在目标设备上运行,那么就会调用这个备用Shader。
每个subshader都至少具有一个Pass,它读入数据处理后再输出数据。
你可以使用这些passes执行不同的操作。
例如,在Grab Pass中你可以捕捉到显示屏上已经呈现的像素。
通过这种方法可以得到一些高级的屏幕效果。
Unity3Dshader简介Unity3D shader简介可以肯定的说Unity3D使得很多开发者开发游戏更容易。
毫⽆疑问,shader(着⾊器)编码,仍有很长的路要⾛。
shader是⼀个专门运⾏在GPU的程序,经常被神秘包围,它最终绘制3D模型的三⾓形。
如果你想给游戏⼀个特殊的显⽰,学习如何编写shader是必要的。
Unity3D使⽤shader做后期处理,对2D游戏也是必不可少的。
这个系列的⽂章将逐步介绍shader编程,并⾯向⼏乎没有任何shader知识的开发者。
简介下图⼤致表⽰了在Unity3D渲染流程中发挥作⽤的3个不同实体:3D模型本质上是,被称为顶点的3D坐标集合。
他们连接在⼀起构成⼀些三⾓形。
每个顶点包含⼀些其它的信息,如颜⾊、点指的⽅向(法线)、纹理映射坐标(UV数据)。
没有材质模型是不能被渲染的。
材质包含⼀个shader和其属性值的封装。
因此,不同材质可以共享相同的shader,赋予不同的数据。
shader剖析Unity3D⽀持两种不同的shader:表⾯shader、⽚段和顶点shader。
还有第三种类型:固定管线shader,但是如今已经过时了,将不包含在本系列⽂章。
⽆论你需要的是哪种类型,shader的结构都⼀样:Shader "MyShader"{Properties{// The properties of your shaders// - textures// - colours// - parameters// ...}SubShader{// The code of your shaders// - surface shader// OR// - vertex and fragment shader// OR// - fixed function shader}}可以包含多个SubShader,⼀个接⼀个。
他们包含GPU的实际指令。
Unity3D将找到与你显卡兼容的SubShader,并顺序执⾏他们。
【风宇冲】Unity3D教程宝典之Shader篇:第⼆⼗三讲GrabPass原创⽂章如需转载请注明:转载⾃风宇冲Unity3D教程学院第⼆⼗三讲GrabPassGrabPass是⼀种特殊的pass类型。
当物体将要被绘制时,它抓取屏幕内容并绘制到⼀张texture⾥。
总体来说GrabPass开销较⼤,不如 AlphaBlend等指令。
故能⽤AlphaBlend等指令实现的效果尽量⽤指令,不得不⽤GrabPass时才⽤GrabPass。
(1)GrabPass{} 抓取当前屏幕内容,每次使⽤的开销都⾮常昂贵。
texture⽤_GrabTexture获取(2)GrabPass{"TextureName"}将抓取屏幕内容并保存⾄⼀张texture⾥。
每帧只为第⼀次使⽤这张纹理的物体做⼀次,这种更⾼效例1:ShaderLab⽤法场景背景如下在前端放⼀个cube,shader如下1. Shader "Custom/MyGrabPass" {2. Properties {3. _MainTex ("Base (RGB)", 2D) = "white" {}4. }5. SubShader {6. // Draw ourselves after all opaque geometry7. Tags { "Queue" = "Transparent" }8. // Grab the screen behind the object into _GrabTexture9. GrabPass { }10. // Render the object with the texture generated above, and invert it's colors11. Pass {12. SetTexture [_GrabTexture] { combine one-texture }13. }14. }15. }效果如下例2:有背景如下在前端新建⼀个旋转为(90,180,0)的plane,代码如下1. Shader "Custom/MyGrabPass" {2. Properties {3. _MainTex ("Base (RGB)", 2D) = "white" {}4. }5. SubShader6. {7. Tags{"Queue"="Transparent"}8.9. GrabPass10. {11. }12.13. pass14. {15. Name "pass2"16. CGPROGRAM17. #pragma vertex vert18. #pragma fragment frag19.20. #include "UnityCG.cginc"21. sampler2D _GrabTexture;22. float4 _GrabTexture_ST;23. struct v2f {24. float4 pos : SV_POSITION;25. float2 uv : TEXCOORD0;26. } ;27. v2f vert (appdata_base v)28. {29. v2f o;30. o.pos = mul(UNITY_MATRIX_MVP,v.vertex);31. o.uv = TRANSFORM_TEX(v.texcoord,_GrabTexture);32. return o;33. }34. float4 frag (v2f i) : COLOR35. {36. float4 texCol = tex2D(_GrabTexture,i.uv);37. return texCol;38. }39. ENDCG40. }41. }42. }效果如下,就是抓取了屏幕背景并贴到前端的plane上但是uv上下反了,于是把代码36⾏的float4 texCol = tex2D(_GrabTexture,i.uv);改为 float4 texCol = tex2D(_GrabTexture,float2(i.uv.x,1-i.uv.y));效果如下Grabpass并指定texture名称,效果也⼀样1. Shader "Custom/MyGrabPass" {2. Properties {3. _MainTex ("Base (RGB)", 2D) = "white" {}4. }5. SubShader6. {7. Tags{"Queue"="Transparent"}8.9. GrabPass10. {11. "_MyGrabTexture"12. }13.14. pass15. {16. Name "pass2"17. CGPROGRAM18. #pragma vertex vert19. #pragma fragment frag20.21. #include "UnityCG.cginc"22. sampler2D _MyGrabTexture;23. float4 _MyGrabTexture_ST;24. struct v2f {25. float4 pos : SV_POSITION;26. float2 uv : TEXCOORD0;27. } ;28. v2f vert (appdata_base v)29. {30. v2f o;31. o.pos = mul(UNITY_MATRIX_MVP,v.vertex);32. o.uv = TRANSFORM_TEX(v.texcoord,_MyGrabTexture);33. return o;34. }35. float4 frag (v2f i) : COLOR36. {37. float4 texCol = tex2D(_MyGrabTexture,float2(i.uv.x,1-i.uv.y));38. return texCol;39. }40. ENDCG41. }42. }43. }。
Unity透明效果Unity 中实现透明效果⼀般有两种⽅法透明度测试(Alpha Test)原理:只要⽚元的透明度不符合要求就直接舍弃不关闭深度写⼊(ZWrite)Shader "AlphaTest"{Properties{_MainTex ("Main Tex", 2D) = "white" {}_Color ("Color", Color) = (1, 1, 1, 1)_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5 //控制剔除的阈值}SubShader{Tags { "Queue"="AlphaTest" "IgnoreProjection"="True" "RanderType"="TransparentCutout"}Pass{Tags { "LightMode"="ForwardBase" }Cull Off //⽤于双⾯渲染,不剔除背对摄像机的图元CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 worldPos : TEXCOORD1;float3 worldNormal : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;fixed _Cutoff;fixed4 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldNormal = UnityObjectToWorldNormal(v.normal);return o;}fixed4 frag (v2f i) : SV_Target{float3 worldNormal = normalize(i.worldNormal);float3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));float4 texColor = tex2D(_MainTex, i.uv);clip(texColor.a - _Cutoff);//Equal to//if( (texColor.a - _Cutoff) < 0.0 ){// discard;//}float3 albedo = texColor.rgb * _Color.rgb;float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;float3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));return fixed4(ambient + diffuse, 1.0);}ENDCG}}FallBack "Transparent/Cutout/VertexLit"}透明度测试可以⽤于消解动画效果的实现透明度混合(Alpha Blending)原理:当前⽚元的透明度作为混合参数与颜⾊缓冲中的颜⾊值混合关闭深度写⼊,但不关闭深度测试关闭深度写⼊将导致渲染顺序变得⾮常重要⼀般做法:1. 先渲染所有不透明物体,同时开启深度写⼊和深度测试2. 半透明物体按距离远近排序,然后从后往前渲染,开启深度测试,关闭深度写⼊由于排序是对于物体来说的,当物体间循环重叠时就需要⽤分割物体、分割⽹格的⽅法来解决尽可能让模型是凸⾯体让透明通道更柔和,难以分辨使⽤开启深度写⼊的半透明效果近似物体半透明对于双⾯渲染的透明度混合,由于关闭了深度写⼊,在渲染时需要控制渲染顺序SubShader {Tags {"Queue"="Transparent" "IgnoreProjection"="True" "RanderType"="Transparent"}ZWrite OffBlend SrcAlpha OneMinusSrcAlpha //开启混合模式,设定混合因⼦Pass {...Cull Front //剔除正⾯,渲染背⾯...}Pass {...Cull Back //提出背⾯,渲染正⾯...}}半透明物体的阴影没了,暂时不知道原因深度写⼊的半透明效果使⽤两个 Pass第⼀个开启深度写⼊但不输出颜⾊第⼆个进⾏透明度混合由于深度信息是对像素来说的,所以如果单个模型本⾝存在⾃我遮挡,那么被遮挡部分就直接舍弃了ColorMask RGB | A | 0 | ...表⽰当前 Pass 写⼊的颜⾊通道Unity预定义渲染队列由SubShader的Queue标签定义:Tags { "Queue"="AlphaTest" }名称索引号描述Background1000最先开始渲染的队列,⼀般⽤于绘制于背景上的物体Geometry2000默认队列,不透明物体AlphaTest2450透明度测试,在不透明物体之后渲染可以更⾼效Transparent3000透明度混合,从后往前的顺序进⾏渲染Overlay4000⽤于最后渲染的物体,实现⼀些叠加效果名称索引号描述索引号越⼩越早被渲染混合混合不可编程但⾼度可配置混合源颜⾊(当前⽚元)和⽬标颜⾊(颜⾊缓冲)Blend SrcFactor DstFactor: 只混合rgb通道Blend SrcFactor DstFactor,SrcFactorA DstFactorA: 上⾯的基础上,再混合 a 通道例⼦:Blend SrcAlpha OneMinusSrcAlpha:开启混合,并且混合结果是Src.a∗Src.rgb+(1−Src.a)∗Des.rgb 还可以配置混合操作BlendOp BlendOperation即改变源颜⾊和⽬标颜⾊最后的混合⽅式,默认为 Add操作描述Add加法Sub减法RevSub交换减法Min取各分量的最⼩值Max取各分量的最⼤值同时使⽤上⾯两种⽅法可设定混合类型类型描述正常Blend SrcAlpha OneMinusSrcAlpha柔和相加Blend OneMinusDstAlpha One正⽚叠底Blend DstColor Zero两倍相乘Blend DstColor SrcColor变暗BlendOp Min Blend One One变亮BlendOp Max Blend One One滤⾊Blend OneMinusDstColor One 线性减淡Blend One One Processing math: 100%。
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院
Shader第十二讲Alpha测试
引言:本讲和下一讲主要讲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.8)知道。
看不懂这段引言?没关系,往下看,当学完第五讲和第六讲后再回来看就自然能深刻理解了。
什么是通道:
通道是8位的灰度图像,能够显示256种灰度,用来表示颜色的RGBA值。
R=Red红色,G=Green绿色,B=blue蓝色,A=alhpa透明值, 其中RGB为原色通道,A为透明通道。
在通道中,以白色代替透明表示要处理的部分(选择区域);以黑色表示不需处理的部分(非选择区域)
所有通道取值范围是[0,255],但是在Shader里取值范围是[0,1], 0和1分辨对应0和255
什么是Alpha通道:
定义:一般图形卡具有32位总线,附加的8位信号就被用来保存不可见的透明度信号以方便处理用,这就是Alpha通道。
白色的alpha象素用以定义不透明的彩色象素,而黑色的alpha象素用以定义透明象素,黑白之间的灰阶用来定义半透明象素。
简而言之:Alpha通道取值同样为[0,255] 以及Shader[0,1], 值越小最透明,值最大越不透明。
在Shader里即0为透明,什么都没有,编辑器显示为黑色。
1则不透明,全部都显示,编辑器其显示为白色如下图。
什么是Alpha Test:
Alpha Test ,中文就是透明度测试。
简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。
AlphaTest语句通常位于Pass{}中的起始位置。
语法:
第一种: AlphaTest Off:不测试,全渲染
第二种:Alpha 比较符目标alpha值
其中目标alpha值取值范围是0至1,也可以用参数,如AlphaTest [varName]。
比较符:(目标alpha值下面记作x)
Always 全渲染(任意x值)
Never 全不渲染
Greater 点的alpha值大于x时渲染
GEuqal 点的alpha值大于等于x时渲染
Less 点的alpha值小于x时渲染
LEqual 点的alpha值小于等于x时渲染
Equal 点的alpha值等于x时渲染
NotEqual 点的alpha值不等于x时渲染
例:
AlphaTest never 0 全不渲染(这个0可以是任意值,但必须填)
AlphaTest always 0 全渲染(这个0可以是任意值,但必须填)
AlphaTest off 全渲染
AlphaTest Greater 0.4 当alpha大于0.4渲染,缺点是边缘过于锋利并且显示不完整,alpha 小于0.4的部分被忽略掉了
Alpha Blend 边缘柔和,但是中心也太柔和,没有实体的感觉
AlphaTest Greater 0.4 / AlphaTestLEqual 0.4 两个部分,大于0.4不混合,小于0.4混合。
效果是既有实体感觉,边缘也柔和。