shader_shaderlab - CSDN
精华内容
参与话题
  • ShaderGraph从入门到实战

    千人学习 2019-09-27 10:02:05
    大智和你一起学习ShaderGraph,在实战中探索。 课程内容 ShaderGraph的基本使用 丰富的实战案例: · 全息效果 · 边缘光效果 · 溶解效果 ·&...
  • Shader开发从入门到精通

    万人学习 2020-03-15 19:43:15
    Shader编程从入门到精通视频教程,该课程主要分享2D中的Shader与3D中的Shader编程,具体功能包括颜色配置、纹理、UV动画、滤镜等。
  • Shader入门教程(一)

    千次阅读 2019-11-23 17:07:19
    学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用shader编写出自己想要的特效,好...

    学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用shader编写出自己想要的特效,好了,下面我开始详细介绍shader的入门知识。

    我在这篇文章中主要介绍的内容有 
    ①Shader基础知识 
    ②Unity中Shader知识介绍 
    ③Surface Shader语法

    Shader基础知识

    什么是Shader?

    在讲什么是Shader之前我们先看看下面两段代码 

    这里写图片描述

     

    这两段代码实现的功能都是提取 2D 图像上每个像素点的颜色值,第一段代码是用c++写的,在cup上面运行,它需要循环遍历每个像素点,第二段代码是CG代码,在GPU上面运行,它只需要一行代码就能实现同样的功能。GPU是专门用来进行图形处理的,而Shader,就是GPU执行的一段针对3D对象进行操作的程序。

    维基百科上对shader的解释是这样(https://zh.wikipedia.org/wiki/%E7%9D%80%E8%89%B2%E5%99%A8

    Shader(着色器)应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令,用于计算图像的颜色或明暗。但近来,它也能用于处理一些特殊效果,或者视频后处理。通俗地说,着色器告诉电脑如何用特有的一种方法去绘制物体。

    程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性。以前固有的流水线只能进行一些几何变换和像素灰度计算。现在可编程流水线还能处理所有像素、顶点、纹理的位置、色调、饱和度、明度、对比度并实时地绘制图像。着色器还能产生如模糊、高光、有体积光源、失焦、卡通渲染、色调分离、畸变、凹凸贴图、边缘检测、运动检测等效果。

    OpenGL的渲染流程

    知道了什么是shader,我们再来了解一下shader的种类,首先我先介绍一下OpenGL的渲染流程

     

    这里写图片描述

    上图便是OpenGL的渲染流程,其中每一步是干什么的我就不在这篇文章中介绍了,有兴趣的可以看看这篇博客(http://blog.csdn.net/lxdfigo/article/details/8457850),将这个流程简化之后是这样的 
    顶点变换 → 图元装配和光栅化 → 片元纹理映射和着色 → 写入帧缓存

     

    在顶点变换和片元着色这两步时,我们就可以对其编程,进行各种操作,其他的部分我们是没法进行编程的。我们的shader就是作用于顶点变换和片元着色这两个部分的。

    shader的种类

    知道了shader起作用的地点,我们现在可以了解一下shader的种类了。

    shader按管线分类一般分为固定渲染管线与可编程渲染管线。固定渲染管线就是功能固定的管线,比如物体表面光的折射,反射的算法是固定无法修改的,我们只能对这些功能进行配置,比如开启或关闭反射效果,雾化效果等。因为这种管线功能固定,无法在程序上对物体细节的表现给予更多更自由的控制,无法达到更多我们想要的画面效果。所以现在的显卡都是可编程渲染管线,也就是曾经那些我们固定无法修改的部门现在可以编程去修改,自由度高了之后,我们也就能实现更多自己想要的特效了。

    shader的开发语言

    知道了shader的种类,我在来说说shader的开发语言

    HLSL: 主要用于Direct3D。平台:windows。

    GLSL: 主要用于OpenGL。 平台:移动平台(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0)

    CG:与DirectX 9.0以上以及OpenGL 完全兼容。运行时或事先编译成GPU汇编代码。CG比HLSL、GLSL支持更多的平台,Unity Shader采用CG/HLSL作为开发语言。

    Unity中Shader知识介绍

    shader在GPU的渲染流程

     

    这里写图片描述

     

    进入GPU运算首先进行的是Vertex Processor顶点处理器,这个部分就需要我们使用Vertex Shader顶点着色器,顶点着色器运算的结果会交给Pixel Processor像素处理器,也就是片段处理器,在这个部分我需要为像素处理编写Pixel Shader像素着色器程序,这部分计算完后就输出了最终我们可以用于在屏幕上的颜色信息,我们把它叫做Frame Buffer帧缓冲。帧缓冲存储的是计算机依次显示所要的数据。

    Unity中shader的类型

    ①Fixed function shader :属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的回滚。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。

    ②Vertex and Fragment Shader:最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。

    ③Surface Shader:Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法。

    我们先了解一下这三种shader的异同点。

    相同点: 
    ①都必须从唯一一个根Shader开始 
    ②Properties参数部分,作用及语法完全相同 
    ③具体功能都在SubShader里(Subshader会自上而下运行第一个硬件能支持的) 
    ④SubShader都可以打标签 
    ⑤都可以回滚 
    ⑥都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。但是Vertex and Fragment和Surface都能实现Fixed function实现不了的高级功能,例如基于uv计算的效果等等。

    不同点 
    ①Fixed function shader以及Vertex and Fragment Shader在subshader下面还有pass{}结构,但是Surface Shader,已经将具体内容打包在光照模型了,不能加pass{} 
    ②Fixed function shader每句代码之后没有分号“;”, 但是V&F shader以及Surface shader每句代码之后都必须加分号“;” 
    ③核心结构不同 
    Fixed function shader的SunShader中的结构为

    Material{} 
    ……
    SetTexture[_MainTex]{
        ……
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    Vertex and Fragment Shader的核心结构为

    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag   
    ……       
    #include "UnityCG.cginc"
    ENDCG
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Surface Shader的核心结构是

    CGPROGRAM
    #pragma surface surf Lambert
    ……
    ENDCG
    • 1
    • 2
    • 3
    • 4

    可以看到这三种shader的Subshader内的编码实现是不一样的,这三种shader的结构如下图,他们的不同点都在SubShader里面 

    这里写图片描述

     

    因为Unity推荐Surface Shader,所以文章直接分析Surface Shader的用法,其他两种shader就不做过多介绍了。

    Surface Shader语法

    在Unity的项目面板中直接创建一个Stander surface shader,默认生成的代码如下

    Shader "Custom/DiffuseShader" {
        Properties {
            _Color ("Color", Color) = (1,1,1,1)       //设置一个默认的颜色值
            _MainTex ("Albedo (RGB)", 2D) = "white" {}  //默认的白色纹理
            _Glossiness ("Smoothness", Range(0,1)) = 0.5  //默认的光泽度
            _Metallic ("Metallic", Range(0,1)) = 0.0    //金属光泽度
        }
        SubShader {
            Tags { "RenderType"="Opaque"}
            LOD 200
    
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            #pragma surface surf Standard fullforwardshadows
    
            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma target 3.0
    
    
            fixed4 _Color;
            sampler2D _MainTex;
            half _Glossiness;
            half _Metallic;
    
    
            struct Input {
                float2 uv_MainTex;
            };
    
    
    
            void surf (Input IN, inout SurfaceOutputStandard o) {
                // Albedo comes from a texture tinted by color
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                // Metallic and smoothness come from slider variables
                o.Metallic = _Metallic;
                o.Smoothness = _Glossiness;
                o.Alpha = c.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    接下来我来介绍一下这段代码

    Properties {}

    Properties{}是定义着色器属性的,在这里定义的属性将被作为输入提供给所有的子着色器。属性定义的格式如下

    _Name(“Display Name”, type) = defaultValue[{options}]

    _Name代表的是属性名,如Color,MainTex,Glossiness ,Metallic 等

    ”Display Name”则是在Inspector中显示的名字

    type代表属性:

        Color - 一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
        2D - 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
        Rect - 一个非2阶数大小的贴图;
        Cube - 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
        Range(min, max) - 一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等);
        Float - 任意一个浮点数;
        Vector - 一个四维数;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这段默认Properties在Inspector中的显示效果如下 

    这里写图片描述

     

    SubShader{}

    Tags :tags标签是三种类型的shader都具有的标签,它决定了硬件什么调用该子着色器

    Tags标签里面默认的“RenderType”=”Opaque”,是告诉系统应该在渲染非透明物体时调用这个SubShader
    “RenderType”=”Transparent”表示在渲染含有透明效果的物体时调用该Sunshader,
    
    Tags里面还有许多其他的我们可选的标签
    ①.”Queue”:定义渲染顺序。预制的值有这些 
        ”Background”。值为1000。比如用于天空盒。
        ”Geometry”。值为2000。大部分物体在这个队列。不透明的物体也在这里。
        ”AlphaTest”。值为2450。已进行AlphaTest的物体在这个队列。 
        ”Transparent”。值为3000。透明物体。 
        ”Overlay”。值为4000。比如镜头光晕。 
        用户可以定义任意值,比如”Queue”=”Geometry+10”
    ②“RenderType”:定义渲染类型。预制的值有这些
        ”Opaque”:绝大部分不透明的物体都使用这个; 
        ”Transparent”:绝大部分透明的物体、包括粒子特效都使用这个; 
        ”Background”:天空盒都使用这个; 
        ”Overlay”:GUI、镜头光晕都使用这个; 
    ③”ForceNoShadowCasting”:定义物体是否有阴影效果
        “true”。表示有阴影
        “false”。表示没有阴影
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    LOD:Level of Detail的缩写,它表示着色器的细节层次效果。在某些硬件比较差的系统上,我们可以设置一个低一点的值,减少细节的显示。Unity内置shader的LOD值如下

    • VertexLit kind of shaders = 100
    • Decal, Reflective VertexLit = 150
    • Diffuse = 200
    • Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
    • Bumped, Specular = 300
    • Bumped Specular = 400
    • Parallax = 500
    • Parallax Specular = 600

    CGPROGRAM 到ENDCG这一部分就这这个shader的核心内容了

    #pragma surface surf Standard fullforwardshadows
    • 1

    这段编译指令声明了我们要写一个Surface Shader,并指定了光照模型。它的写法是这样的

    #pragma surface surfaceFunction lightModel [optionalparams]
    • 1
    • surface - 声明的是一个表面着色器
    • surfaceFunction - 着色器代码的方法的名字
    • lightModel - 使用的光照模型。

    这段代码默认的surfaceFunction为surf,我们可以在源码的底部看到在这儿声明了的surf函数。默认的lightModel为Standard。

    下面我先介绍一下lightModel光照模型

    • Lambert:该光照模型能很好的表示粗糙表面的光照,但不能表现出镜面反射高光

    • Toon:最近在游戏中常用的风格之一即是Toon shading(又称 cel shading).这是一种非逼真渲染风格,通过改变了光在一个模型上反射实际情况来给人以手绘的感觉

    • BlinnPhong:仿真镜面反射材料

    • Standard:Unity5中默认的光照模式是Standard, 其引入了 物理渲染 (PBR), 但是与其它光照模型没有什么不同。相比于朗伯反射, PBR提供了一个更加逼真的光线物体作用模型,PBR考虑了材料的物理属性, 比如能量守恒以及光的散射

    接下来的这段代码

       fixed4 _Color;
       sampler2D _MainTex;
       half _Glossiness;
       half _Metallic;
    • 1
    • 2
    • 3
    • 4

    我们可以发现 _Color,_MainTex,_Glossiness,_Metallic都shader属性的声明,在上面的Properties 中已经声明过了这些属性,但是在这段CG程序,要想访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字再次进行声明,其实就是链接在上面properties中声明的属性。

    我再来介绍一下shader中常用的数据类型

    3种基本数值类型:float、half和fixed。 
    这3种基本数值类型可以再组成vector和matrix,比如half3是由3个half组成、float4x4是由16个float组成。

    float:32位高精度浮点数。 
    half:16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。 
    fixed:11位低精度浮点数。范围是[-2, 2],精度是1/256。 
    Sampler2D:2D纹理属性

    接下来就是Input结构体

    struct Input {
        float2 uv_MainTex;
    };
    • 1
    • 2
    • 3

    这个结构体和surf函数中的另一个参数inout结构体是相对的,一个代表输入,一个代表输出。我们可以这样理解这两个结构体,你定义输入数据结构(Inputs Struct)、编写自己的Surface函数处理输入、最终输出修改过后的SurfaceOutput。Input其实是需要我们去定义的结构,所以我们可以把所需要参与计算的数据都放到这个Input结构中,传入surf函数使用

    默认的Input结构体中有一个uv_MainTex参数,代表了纹理的UV值,我们便可以在surf函数中直接使用这个参数了。

    知道了Input的结构体,我们在来看看Output的结构体

    struct SurfaceOutput
    {
        fixed3 Albedo;  // diffuse color  漫反射的颜色值。
        fixed3 Normal;  // tangent space normal, if written 法线坐标
        fixed3 Emission;  //自发光颜色
        half Specular;  // specular power in 0..1 range 镜面反射系数
        fixed Gloss;    // specular intensity   光泽系数
        fixed Alpha;    // alpha for transparencies  透明度系数
    };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    现在我们在来看看surf函数里面的内容,就已经能够看懂了

    我们现在在来看看surf函数里面的代码,就能知道里面是什么意思了

            void surf (Input IN, inout SurfaceOutputStandard o) {
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;               //将物体显示的漫反射颜色设置成在纹理的颜色值
                o.Metallic = _Metallic;         //将物体显示的金属光泽设置成在properties中定义的光泽
                o.Smoothness = _Glossiness;     //设置物体显示的光滑度
                o.Alpha = c.a;                  //设置物体显示的透明度
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyuiof/article/details/52754300
    展开全文
  • Shader学习建议

    千次阅读 2019-03-11 21:27:32
    而游戏中酷炫逼真的效果又是由shader来控制实现的。所以想要提高自己技能就必须啃下shader这个硬骨头。 以下提供本人学习shader的心路历程。由于每个人学习方式不同,所以下面建议不适应所有人。学习过程如下: ...

    作为一名从业六年的游戏开发人员,搭过框架也做过优化。但是对图形渲染这块不了解。而游戏中酷炫逼真的效果又是由shader来控制实现的。所以想要提高自己技能就必须啃下shader这个硬骨头。

    以下提供本人学习shader的心路历程。由于每个人学习方式不同,所以下面建议不适应所有人。学习过程如下:
    1.作为一名客户端开发人员,首先要会应用shader做出上级分配的任务才是优先级最高的事情。几乎所有游戏引擎都提供了shader的上层封装,这也就更方便我们应用shader了。如:unity引擎中提供了unity shader,它是在底层图形api接口上做的一层封装,我们可以手写unity shader或者用unity的shader graph来拖拽实现想要的效果。unity shader的学习可以参考《Unity Shader入门精要》这本书,也可以参考本人unity shader专栏,里面是对《Unity Shader入门精要》学习的总结。

    2.会应用shader后就需要去了解底层的实现了。虽然引擎帮我们封装了接口,也提供了工具去写引擎定制的shader来帮我们实现想要的效果。但是作为unity长期用户来说,unity的bug还真不少,谁知道某一天会不会在渲染这个给你来一个bug,虽然引擎最终会修复,但也是漫长的等待。此时就必须对引擎的渲染底层有所了解,这样出问题了知道是哪里的问题并立马进行修复或者给出替代解决方案,这一点很重要。

    3.底层api选择:现在市面上主要有苹果公司的metal,微软公司的direct 3d以及跨平台的opengl。metal主要是针对苹果的a系列处理器做了优化,在苹果产品上的确性能很高。direct 3d主要在微软产品上应用,而且曾经跟opengl有场你死我活的api之争。但是很多开发者和硬件厂商还是选择支持opengl,就因为它的跨平台和高性能的特性。所以毫无悬念,本人这里也是选择opengl作为底层图形api学习的标准。

    4.opengl的学习资料:首先要了解opengl的发展历程,这个https://www.cnblogs.com/George1994/p/6418013.html链接中记录了大部分的opengl版本变化,最新的opengl已经发布到4.6了,详细的版本信息可以参照opengl官网。现在市面上比较受欢迎的书籍就是《OpenGL超级宝典(中文第5版3.3或者英文第七版4.5)》和《OpenGL编程指南(中文第九版4.5)》。建议先学习opengl超级宝典第五版,虽然现在opengl已经到最新的4.6了,而超级宝典第五版里面只是到3.3,但是并没有关系,因为3.3到4.6之间的核心架构都没变,只是引进了一些新的功能以及改善了某些功能的实现而已。而且书中细节讲解的很清晰,还有大量的例子来佐证,非常适合opengl初学者。当看完超级宝典第五版后建议再学习下opengl编程指南第九版,该书针对opengl4.5版本,不仅引入了很多有意思和高大上的技能讲解,可以继续更深层次学习3.3往后的版本技能。还可以当做api参考书,无疑是opengl界的新华字典。

    5.开始学习之旅啦!!!我会建立两个专栏,分别是opengl超级宝典第五版和opengl编程指南第九版。里面会总结学习的心得。有兴趣的朋友可以关注下。专栏会在周末空闲时间不定期更新,虽然历程有些漫长,但是静下心来慢慢撸,总会撸完的。

    展开全文
  • Shader各种效果

    千次阅读 2018-05-16 09:09:41
    1.Shader1.0的Alpha测试Shader "Hidden/AlphaTestShader1.0" { Properties { _MainTex ("Texture", 2D) = "white" {} _AlphaTest("Alpha值",float) = 0 } ...

    1.Shader1.0的Alpha测试

    Shader "Hidden/AlphaTestShader1.0"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_AlphaTest("Alpha值",float) = 0
    	}
    	SubShader
    	{
    		AlphaTest Greater [_AlphaTest]
    		Pass
    		{
    			SetTexture[_MainTex]
    			{
    				combine texture
    			}
    		}
    	}
    }
    

    2.Shader2.0

    2.1 轮廓自发光

            两个Pass,一个渲染原本的贴图,一个渲染颜色,将顶点的xy方向扩大。

    Shader "Custom/OutLine2.0"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_TestColor("轮廓自发光颜色",Color)=(1,1,1,1)
    		_Width("轮廓宽度",Float)=1.1
    	}
    	SubShader
    	{
    		// No culling or depth
    		//Cull Off ZWrite Off ZTest Always//后期屏蔽的
    
    		Pass
    		{
    
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			float _Width;/*****************************/
    			v2f vert (appdata v)
    			{
    				v2f o;
    				
    				v.vertex.xy *= _Width;/*********************/
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;
    
    			Vector _TestColor;/************************/
    			fixed4 frag (v2f i) : SV_Target
    			{
    				fixed4 col = tex2D(_MainTex, i.uv);
    				// just invert the colors
    				//col.rgb = 1 - col.rgb;
    				return fixed4(_TestColor);/*********************/
    				//return col;
    			}
    			ENDCG
    		}
    
    			Pass
    			{
    				ZTest Always
    				CGPROGRAM
    				#pragma vertex vert
    				#pragma fragment frag
    
    				#include "UnityCG.cginc"
    
    				struct appdata
    				{
    					float4 vertex : POSITION;
    					float2 uv : TEXCOORD0;
    				};
    
    				struct v2f
    				{
    					float2 uv : TEXCOORD0;
    					float4 vertex : SV_POSITION;
    				};
    
    				v2f vert(appdata v)
    				{
    					v2f o;
    					o.vertex = UnityObjectToClipPos(v.vertex);
    					o.uv = v.uv;
    					return o;
    				}
    
    				sampler2D _MainTex;
    
    				fixed4 frag(v2f i) : SV_Target
    				{
    					fixed4 col = tex2D(_MainTex, i.uv);
    				// just invert the colors
    				//col.rgb = 1 - col.rgb;//后期屏蔽的
    				
    				return col;
    				}
    				ENDCG
    			}
    	}
    }
    

    2.2 Alpha测试

    Shader "Hidden/AlphaTestShader2.0"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_AlphaValue("Alpha值",float)=0
    	}
    	SubShader
    	{
    		// No culling or depth
    		//Cull Off ZWrite Off ZTest Always
    			Blend SrcAlpha OneMinusSrcAlpha//打开Alpha通道
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			v2f vert (appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;
    
    			float _AlphaValue;
    			fixed4 frag (v2f i) : SV_Target
    			{
    				fixed4 col = tex2D(_MainTex, i.uv);
    
    			if (col.a < _AlphaValue)
    			{
    				return fixed4(0, 0, 0, 0);
    			}
    			else
    			{
    				return col;
    			}
    			}
    			ENDCG
    		}
    	}
    }
    

    3.Shader2.0 的UV动画

    3.1 UV滚动(流动)

    Shader "Custom/River"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_SpeedY("Y向流动速度",Range(0,10))=1.0
    		_SpeedX("X向流动速度",Range(0,20)) = 0
    	}
    	SubShader
    	{
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			v2f vert (appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;
    
    
    			float _SpeedY;/*增***********************/
    			float _SpeedX;/*增***********************/
    			fixed4 frag (v2f i) : SV_Target
    			{
    				float2 tempUV = i.uv;/*增***********************/
    				tempUV.x += _Time.x*_SpeedX;/*增***********************/
    				tempUV.y += _Time.y*_SpeedY;/*增***********************/
    
    				fixed4 col = tex2D(_MainTex, tempUV);/*改***********************/
    				
    				return col;
    			}
    			ENDCG
    		}
    	}
    }
    

    3.2 UV波动(wave)

    Shader "Custom/Wave"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_Arange("波动幅度",float) = 1
    		_Frenquncy("波动频率",float)=0.5
    		_Speed("波动速度", float) = 0.5
    	}
    	SubShader
    	{
    		
    
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			float _Arange;/*增******************************/
    			float _Frenquncy;/*增******************************/
    			float _Speed;/*增******************************/
    			v2f vert(appdata v)
    			{
    
    				v2f o;
    
    				float timer = _Time.y*_Speed;/*增******************************/
    				float waver = _Arange * sin(timer + v.vertex.x*_Frenquncy);/*增******************************/
    
    				v.vertex.y = v.vertex.y + waver;/*增******************************/
    
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;
    
    			
    
    			fixed4 frag (v2f i) : SV_Target
    			{
    				fixed4 col = tex2D(_MainTex, i.uv);
    				// just invert the colors
    				//col.rgb = 1 - col.rgb;
    				return col;
    			}
    			ENDCG
    		}
    	}
    }
    

    3.3 UV旋转(Loading)

    Shader "Custom/Loading_Icon"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_RotateSpeed("旋转速度",float) = 15.0
    	}
    	SubShader
    	{
    		// No culling or depth
    		//Cull Off ZWrite Off ZTest Always
    
    		Blend SrcAlpha OneMinusSrcAlpha//打开Alpha通道
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			v2f vert (appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;/**增******************************/
    			float _RotateSpeed;/**增******************************/
    			fixed4 frag (v2f i) : SV_Target
    			{
    				/**增******************************/
    				float2 tempUV = i.uv;
    
    				tempUV -= float2(0.5, 0.5);//1.平移到原点
    										  
    				if (length(tempUV) > 0.5)//防止对角线多余的长度显示
    				{
    					return fixed4(0, 0, 0, 0);
    				}
    
    				/*2.绕z轴旋转******************************/
    				float2 finalUV = 0;
    				float angle = _Time.x*_RotateSpeed;
    
    				finalUV.x = tempUV.x*cos(angle) - tempUV.y*sin(angle);
    				finalUV.y = tempUV.x*sin(angle) + tempUV.y*cos(angle);
    
    				finalUV += float2(0.5, 0.5);//3.将贴图平移回原位置
    				/**增******************************/
    				fixed4 col = tex2D(_MainTex, finalUV);/**改******************************/
    				
    				return col;
    			}
    			ENDCG
    		}
    	}
    }
    

    3.4 屏幕高斯效果

    3.4.1 Shader

    Shader "Custom/MyShader"
    {
    	Properties
    	{
    		_MainTex ("贴图", 2D) = "white" {}
    		_Amnient("高斯模糊程度",Float) = 0.001
    	}
    	SubShader
    	{
    		// No culling or depth
    		//Cull Off ZWrite Off ZTest Always
    
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    			};
    
    			v2f vert (appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    			
    			sampler2D _MainTex;
    
    			float _Amnient;
    			fixed4 frag (v2f i) : SV_Target
    			{
    				float2 tempUV = i.uv;/*增**********************/
    				float ambient = _Amnient;/*增**********************/
    				fixed4 col = tex2D(_MainTex, tempUV);/*改**********************/
    				// just invert the colors
    				//col.rgb = 1 - col.rgb;
    				fixed4 col2 = tex2D(_MainTex, tempUV + float2(-ambient, 0));/*增**********************/
    				fixed4 col3 = tex2D(_MainTex, tempUV + float2(0,-ambient));/*增**********************/
    				fixed4 col4 = tex2D(_MainTex, tempUV + float2(ambient, 0));/*增**********************/
    				fixed4 col5 = tex2D(_MainTex, tempUV + float2(0,ambient));/*增**********************/
    
    				col = (col + col2 + col3 + col4 + col5) / 5.0;/*增**********************/
    				return col;
    			}
    			ENDCG
    		}
    	}
    }
    

    3.4.2 C#

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    /// <summary>
    /// 需要挂载到相机上
    /// </summary>
    public class CameraMove : MonoBehaviour {
    
        // Use this for initialization
        //public Shader myShader;
        public Material material;
    	void Start () {
            //material = new Material(myShader);
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
        /// <summary>
        /// 
        /// </summary>
        /// <param name="source">拦截到相机所渲染的图片</param>
        /// <param name="destination">更改后返回的图片,重新交给引擎</param>
        private void OnRenderImage(RenderTexture source, RenderTexture destination)
        {
            Graphics.Blit(source, destination, material);
        }
    }
    

    4. Surface5.0

    4.1 UV 滚动

    Shader "Custom/TestParameter" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert vertex:MyVertex
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    
    		struct Input {
    			float2 uv_MainTex;
    			float3 myColor;
    		};
    
    		
    		fixed4 _Color;
    
    		void MyVertex(inout appdata_base v,out Input o)
    		{
    			UNITY_INITIALIZE_OUTPUT(Input, o);
    			o.myColor = _Color.rgb*abs(v.normal);
    		}
    
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
    			o.Albedo = c.rgb*IN.myColor;
    			
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    4.2 高光

    Shader "Custom/CustomLighting" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_SpeclPower("高光强度",float) = 1
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Simple
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    
    		struct Input {
    			float2 uv_MainTex;
    		};
    
    
    		fixed4 _Color;
    
    		
    		UNITY_INSTANCING_BUFFER_START(Props)
    			// put more per-instance properties here
    		UNITY_INSTANCING_BUFFER_END(Props)
    
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    			o.Albedo = c.rgb;
    			
    			o.Alpha = c.a;
    		}
    
    		float _SpeclPower;
    		///自定义的灯光入口函数
    		half4 LightingSimple(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
    		{
    			float NDotL = dot(lightDir, s.Normal);
    
    			half4 result = 0;
    			//result.rgb = s.Albedo* _LightColor0*NDotL*atten;//漫反射
    
    
    			half3 H = viewDir - lightDir;
    			float HDotN = dot(H, s.Normal);
    
    			result.rgb = s.Albedo* _LightColor0*NDotL*atten+HDotN* s.Albedo* _LightColor0*_SpeclPower;
    			result.a = s.Alpha;
    
    			return result;
    		}
    
    		ENDCG
    	}
    	FallBack "Diffuse"
    

    }

    4.3 法线贴图

            可以使对比度增强,使凸的地方看起来更凸。

    Shader "Custom/NormalMap" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_NormalMap("法线贴图", 2D) = "white" {}
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    		sampler2D _NormalMap;
    		struct Input {
    			float2 uv_MainTex;
    			float2 uv_NormalMap;
    		};
    
    	
    		fixed4 _Color;
    
    		
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    			
    			o.Normal= UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex));
    			o.Albedo = c.rgb;
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    4.4 边缘自发光

    Shader "Custom/NormalOutLine" {
    	Properties {
    		_Color ("自发光颜色", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_NormalTex("法线贴图", 2D) = "white" {}
    		_EmisionPower("自发光强度",float) = 1
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    		sampler2D _NormalTex;
    		struct Input {
    			float2 uv_MainTex;
    			float2 uv_NormalTex;
    
    			float3 viewDir;
    		};
    
    		
    		fixed4 _Color;
    		float _EmisionPower;
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
    			o.Albedo = c.rgb;
    
    			//读取法线
    			float3 tempNormal= UnpackNormal(tex2D(_NormalTex, IN.uv_NormalTex));
    			
    			o.Normal = tempNormal;
    			//算出法线和视角的点乘
    			float tempFloat=1- clamp(dot(IN.viewDir, tempNormal),0, 1);//clamp()让取值变到一个范围
    			
    			o.Emission = _Color *pow(tempFloat,_EmisionPower);
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    4.5 Fog

        当需要在某个物体周围呈现雾效,而不是整个场景中呈现雾效,就需要写Shader。

    Shader "Custom/TestFog" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_FogStart("雾的起点",float) = 1
    			_FogEnd("雾的终点",float) = 1
    			_FogColor("雾的颜色",Color)=(1,1,1,1)
    	}
    		SubShader{
    			Tags { "RenderType" = "Opaque" }
    			LOD 200
    
    			CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf   Lambert    vertex:MyVertex    finalcolor:FinalColor
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    
    		struct Input {
    			float2 uv_MainTex;
    
    			float fogData;
    		};
    
    		
    		fixed4 _Color;
    		float _FogStart;
    		float _FogEnd;
    		fixed4 _FogColor;
    		void FinalColor(Input IN,SurfaceOutput o,inout fixed4 color)
    		{
    			//color *= float4(1, 0, 0, 1);
    
    			color = lerp(_FogColor, color, IN.fogData);
    		}
    
    		
    		void MyVertex(inout appdata_full v, out Input data)
    		{
    			UNITY_INITIALIZE_OUTPUT(Input, data);//初始化
    			
    			float tempZ = _FogEnd - length(UnityObjectToViewPos(v.vertex).xyz);
    
    			data.fogData = tempZ/(_FogEnd- _FogStart);
    		}
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    			o.Albedo = c.rgb;
    			
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    4.6 菲尼尔反射

    Shader "Custom/TestFresnel" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_CubeMap("CubeMap",Cube) = ""{}
    		_Rate("折射率",float) = 1
    
    		_FresnelBias("菲尼尔偏移",float) = 1
    			_FresnelScale("菲尼尔缩放系数",float) = 1
    			_FresnelPower("菲尼尔指数",float) = 0.5
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert vertex:MyVertex
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    		samplerCUBE _CubeMap;
    		struct Input {
    			float2 uv_MainTex;
    			float3 worldRefl;//反射
    
    			float refract;//折射
    			float reflectFact;//定义的反射系数
    
    		};
    
    		
    		fixed4 _Color;
    		float _Rate;
    		float _FresnelBias;
    		float  _FresnelScale;
    		float	_FresnelPower;
    		void MyVertex(inout appdata_full v, out Input data)
    		{
    			UNITY_INITIALIZE_OUTPUT(Input, data);//初始化
    
    			//右世界变成物体的
    			float3 localNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
    			//入射角
    			float3 viewDir = -WorldSpaceViewDir(v.vertex);
    
    			data.refract = refract(viewDir, localNormal, _Rate);
    
    			data.reflectFact = _FresnelBias + _FresnelScale * pow(1 + dot(viewDir, localNormal), _FresnelPower);
    		}
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			//fixed4 cflect = tex2D (_MainTex, IN.worldRefl);//反射
    			//fixed4 cfract = tex2D(_MainTex, IN.refract);
    
    			fixed4 cflect = texCUBE(_CubeMap, IN.worldRefl);//反射
    			fixed4 cfract = texCUBE(_CubeMap, IN.refract);
    
    
    			o.Albedo = IN.reflectFact*cflect.rgb + (1 - IN.reflectFact)*cfract.rgb;
    			
    			
    			o.Alpha = cflect.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    4.7 BRDF

            双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)用来定义给定入射方向上的辐射照度(irradiance)如何影响给定出射方向上的辐射率(radiance)。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布--这可以是从理想镜面反射到漫反射、各向同性(isotropic)或者各向异性(anisotropic)的各种反射。

    Shader "Custom/TestBRDF" {
    	Properties {
    		_SpeColor ("高光颜色", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_SpecPower("高光强度",float)=1
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf  BRDFLigthing
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    
    		struct Input {
    			float2 uv_MainTex;
    		};
    
    		
    		fixed4 _SpeColor;
    		float _SpecPower;
    
    		#define PI 3.1415926
    		half4 LightingBRDFLigthing(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
    		{
    			float3 H = normalize(lightDir + viewDir);
    			float3 N = normalize(s.Normal);
    			
    			float d = (_SpecPower + 2)*pow(dot(N, H),_SpecPower) / 8.0;
    
    			float f = _SpeColor + (1 - _SpeColor)*pow(1 - dot(H, N), 5);
    
    			float k = 2 / (sqrt(PI*(_SpecPower + 2)));
    
    			float v = 1 / (dot(N, lightDir)*(1 - k) + k)*(dot(N, viewDir)*(1 - k) + k);
    
    
    			float all = d * f*v;
    			float diff = dot(lightDir, N);
    
    			float tempResult = all + (1 - all)*diff;
    
    			half4 finalColor = 0;
    			finalColor.rgb = tempResult * s.Albedo*_LightColor0.rgb;
    
    			finalColor.a = s.Alpha;
    
    			return finalColor;
    		}
    
    
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
    			o.Albedo = c.rgb;
    			
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    5. CubeMap

    5.1 真反射

        利用CubeMap做真反射;新建一个相机,对准需要反射的内容,新建一个Render Texture,并将此Render Texture赋予反射摄像机的Target Texture;新建一个材质球(标准材质球即可),在贴图通道赋予新建的Render Texture,最后将材质赋予需要有反射性的物体,该物体就会实时反射后一个新建摄像机的内容。但是真反射非常消耗性能。


    5.2 假反射

            也需要建一个需要反射出的内容的CubeMap,一般需要反射的为天空盒。

    Shader "Custom/FalseRelf" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_CubeMap("CubeMap",Cube) = ""{}
    		_CubePower("CubePower",float) = 1
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    		
    	samplerCUBE _CubeMap;
    		struct Input {
    			float2 uv_MainTex;
    
    			float3 worldRefl;//反射角
    		};
    
    		
    		fixed4 _Color;
    		float _CubePower;
    		
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    
    			o.Emission= texCUBE(_CubeMap, IN.worldRefl)*_CubePower;
    			o.Albedo = c.rgb;
    			
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    

    }

    5.3 折

            也需要建一个需要折射看到的内容的CubeMap。

    Shader "Custom/Refract" {
    	Properties {
    		_Color ("Color", Color) = (1,1,1,1)
    		_MainTex ("Albedo (RGB)", 2D) = "white" {}
    		_Rate("折射率",float) = 1
    		_CubeMap("CubeMap",Cube) = ""{}
    	}
    	SubShader {
    		Tags { "RenderType"="Opaque" }
    		LOD 200
    
    		CGPROGRAM
    		// Physically based Standard lighting model, and enable shadows on all light types
    		#pragma surface surf Lambert vertex:MyVertex
    
    		// Use shader model 3.0 target, to get nicer looking lighting
    		#pragma target 3.0
    
    		sampler2D _MainTex;
    		samplerCUBE _CubeMap;
    		struct Input {
    			float2 uv_MainTex;
    
    			float3 refr;
    		};
    
    		float _Rate;
    		void MyVertex(inout appdata_full v,out Input data)
    		{
    			UNITY_INITIALIZE_OUTPUT(Input, data);//初始化
    
    			//右世界变成物体的
    			float3 localNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
    
    			//入射角
    			float3 viewDir=- WorldSpaceViewDir(v.vertex);
    
    			data.refr= refract(viewDir, localNormal, _Rate);
    		}
    		fixed4 _Color;
    		
    		
    		void surf (Input IN, inout SurfaceOutput o) {
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    
    			o.Emission= texCUBE(_CubeMap, IN.refr).rgb;
    			o.Albedo = c.rgb;
    
    			o.Alpha = c.a;
    		}
    		ENDCG
    	}
    	FallBack "Diffuse"
    }
    

    展开全文
  • ShaderForge插件介绍详解

    万次阅读 2017-12-19 21:41:47
    ShaderForge简介ShaderForge是适用于Unity,基于节点的着色器编辑器 。它可让您更轻松地创建自己的着色器 ,而不需要使用代码。开始以之前我想你已经下载好了插件,如果没有的话可以从下方的链接获取。前言1.官网...

    ShaderForge简介

    ShaderForge是适用于Unity,基于节点的着色器编辑器 。它可让您更轻松地创建自己的着色器 ,而不需要使用代码。开始以之前我想你已经下载好了插件,如果没有的话可以从下方的链接获取。

    前言

    1.官网介绍

    官网:http://www.acegikmo.com/shaderforge/(包括文档、教程、论坛线程,链接和更多!)
    商店链接 :https://www.assetstore.unity3d.com/cn/#!/content/14147

    这里写图片描述

    2.Shader

    开始使用插件之前,我们首先来看下Shader是什么东西。Shader翻译过来是着色器。
    着色器用于绘制游戏中的物理资源。它们用于确定当前渲染物体的表面颜色,通过使用纹理、光源、光色、网格数据等信息计算该处的颜色。
    Unity内置了几个着色器,有些专用于粒子和效果,有些则更通用,例如Unity5的标准PBR着色器。

    为什么选择ShaderForge?

    Unity中的默认着色器固然不错,但如果您要在游戏中设计出更
    加与众不同的外观,或者想达到一些非常特别效果。如果您有这种想法,那么您就需要编写自E的着色器。但是,编写自己的着
    色器很困难,而且学起来也很难,对于那些不是程序员出身的人来说更是如此。这就是ShaderForge发挥作用的地方。ShaderForge不需要您知道如何编写代码就能让您创建着色器!
    接下来让我们开始进入ShaderForge的世界。

    ShaderForge基本介绍

    1.导入到Unity项目中

    直接拖入到Unity的项目视图面板或者通过菜单导入,不做过多解释。
    这里写图片描述

    2.界面基本介绍

    打开Shader Forge操作面板
    这里写图片描述
    打开之后的面板
    这里写图片描述

    New Shader:新建一个Shader文件

    Load Shader:导入已有的Shader文件

    PolyCount thread:PolyCount页面

    Unity:Unity Forum的页面,有问题可以去里面提问。

    Node Documentation:Shader Forge中的节点说明文档(重要)

    Wiki:Shader Forge的维基文档

    选择新建Shader
    这里写图片描述

    Unlit:无光照的Shader模板,选择此模板,使用该Shader的材质将不受光照影响。

    Lit(PBR):符合Unity PBR的Shader模板,采用基于物理的光照模型。

    Lit(Basic):使用基础光照模型的Shader模板。

    Custom Lighting:自定义光照Shader,在此Shader模板中实现自己的光照模型。

    Sprite:2D精灵Shader模板,基于2D。

    Particle(Additive):主要应用在发光效果的粒子Shader。

    Particle(Alpha-Blended):主要应用在细碎效果的粒子Shader,如风沙。

    Particle(Multiplicative):主要应用在昏暗效果的粒子Shader,如黑烟。

    Sky:天空盒。

    Post-Effect:屏幕空间后期处理Shader

    选择无光照进入,中间需要保存Shader文件路径自行选择即可。
    也可以自己手动创建一个Shader文件,然后使用ShaderForge打开。
    这里写图片描述

    这里写图片描述

    这里写图片描述

    1.3D预览,用于查看着色器运行时的外观

    • Return to menu:返回界面1。
    • Settings:Shader Forge界面的一些设置。
      这里写图片描述

      • Real-time node rendering:实时节点渲染,是否开启看需求。

      • Using scroll in the quickpicker:在快速拾取中使用滚动。

      • Show variable name & precision:显示变量名和精度,看需求开启。

      • Show node browser panel:显示节点浏览面板,是否开启看个人习惯。

      • Hierarchal Node Move:层次节点移动。

    • Compile shader:编译为.shader文件,编译成功按钮为绿色,编译不成功or改动后按钮为红色。
    • Auto:是否自动编译shader,建议选中。 Skybox:选择天空盒,在不受天空影响的模板中被冻结。
    • Rotate:选中后模型自动旋转。 左上角摄像机按钮:保存当前的连接节点图。
    • 预览面板也支持缩放和旋转视图。

    2.着色器设置,用于配置着色器的渲染方式
    Shader Settings标签
    这里写图片描述
    Path:文件路径,可修改。

    Fallback:在运行平台硬件不支持该shader的情况下,选择替代shader。

    Allow using atlased sprites:2D开发使用,3D默认即可。

    Draw call batching:批处理绘制调用,默认Enable。

    Inspector preview mode:3D/2D/sky,制作的什么类型选什么。

    Target renderers:目标渲染器,如无特殊需求,默认。

    Properties标签
    这里写图片描述
    可以拖动改变显示位置,同时在Inspector面板更新。

    这里写图片描述

    Render Path:渲染路径,正向渲染或延迟渲染,移动平台选择正向渲染即可。

    Light Mode:光照模型,对应不同的Shader模板。分别是无光照(UnLit模板)、Blinn-Phong光照模> > 型,Phong光照模型,PBL(基于物理光照,Lit(PBR)模板)。

    Gloss Mode:使用光泽度还是粗糙度模型,根据自己需要。

    Transparent Mode:透明度模式,淡出or反射。

    Remap gloss from [0,1] to [1,2048]:重映射光泽度从[0,1]到[1,2048]。

    Enery Conversing:能量守恒,PBR需要勾选。

    Lighting Count:光源数量,单一定向光(太阳光)or多重光源

    Lightmap & light probes:灯光贴图&灯光探针。

    Per-pixel light probe sampling:逐像素光照探针采样。

    Reflection probe support:支持反射探针。

    Receive Ambient Light:是否接受环境光。

    Mask directional light specular by shadows:定向光高光是否被阴影遮挡。

    Geometry标签
    这里写图片描述
    Face Culling:面剔除,默认是剔除背面,可选剔除正面,也选择双面渲染。

    Normal Quality:法线质量,插值或归一化,默认使用归一化。

    Vertex Positioning:顶点位置,世界空间or裁剪空间or广告牌(法线面向摄像机)。

    Normal Space:法线空间选择,切线or建模or世界,默认切线空间。

    Vertex offset mode:顶点偏移模式,相对偏移or绝对偏移。基于模型空间的顶点偏移叫做相对偏移,世界空间的顶点偏移叫做绝对偏移。

    Tessellation Mode:曲面细分模式,一般不需要用到曲面细分。

    Outline Extrude Direction:描边挤出方向,一般都是沿着顶点法线方向。

    Per-pixel screen coodinates:逐像素屏幕坐标。

    Show 2D sprite pixel snap option in material:在材质中显示2D精灵像素单元设置,3D开发忽略。

    Blending标签
    这里写图片描述
    Blend Mode:混合模式,如果是不透明的就选择Opaque,其余根据需要选择。

    Source*_+Destination*_:源*_+目标*_,决定了源图像与目标图像以哪种方式混合。

    Color Mask:颜色遮罩,需要过滤的通道取消选择。

    Dithered alpha clip:抖动透明裁剪,开or关。

    Offset Factor:偏移因子。

    Offset Units:偏移单位。

    Per-object refraction/scene color (expensive):

    Receive Fog:应用雾。

    Auto Sort:自动排序,如需手动改变排序,在Order中改变数值。数值越小,在渲染队列越靠前。

    Depth Test:深度测试。

    Ignore Projectors:忽略投影器。

    Write to Depth buffer:是否写入深度缓存。

    Stencil Buffer:是否开启模板缓存。

    3.输出通道
    Diffuse:漫反射

    Diffuse Power:漫反射力道,相当耗能

    Metallic:金属质感,值越大时漫反射越小

    Gloss:光泽,值越高光泽度越高,1为极值,物极必反

    Emisson:自发光

    Transmission:透射,决定有多少光线可以透过材质

    Light Wrapping:环绕光,让光线或某个通道的值环绕对象,可做出皮肤的效果

    Diffuse Ambient Light:漫反射环境光,添加光线或环境光或立体贴图,不用自发光或光源,也能显亮

    Specular Ambient Light:镜面反射环境光,可映出环境的贴图???

    Diffuse Ambient Occlusion:漫反射环境光遮罩,抑制间接漫反射光线

    Specular Ambient Occlusion:镜面反射环境光遮罩,抑制间接镜面反射光线

    Custom Lighting:自定义照明,被光照射时,自定义照射效果

    Opacity:不透明度,控制最终像素的透明度

    Opacity Clip:不透明度剪切,根据阿尔法通道剪切不透明区域

    Refraction:反射,用于折射背景像素的屏幕空间 UV 偏移。
    请确保在使用前将 Opacity(不透明度)设置为低于 1 的值,以便折射效果可见

    Outline Width:描边宽度

    Vertex Offset:顶点偏移,插入每个顶点所需偏移量的 XYZ 坐标

    DX11 Displacement:DX11 位移,此选项和 Vertex Offset(顶点偏移)的作用非常类似,但是与
    DX11 曲面细分一起使用。
    (请注意,DirectX 仅适用于 Windows,需要 DX11 GPU 且必须在 Unity 设置中启用)

    DX11 Tessellation:DX11 曲面细分,此选项控制您要将三角形分割为多少个细分。
    (请注意,DirectX 仅适用于 Windows,需要 DX11 GPU 且必须在 Unity 设置中启用)
    4.节点浏览器,用于查找所需的全部节点

    加减乘除:Add、Subtract、Multiply、Divide

    乘方、平方根、对数:Power、Sqrt、Log

    绝对值:Abs

    Sign:取正负号及0

    Ceil:进位取整,输出时将其输入向上舍入为最近整数

    Round:四舍五入

    Floor:舍位取整,输出时将其输入向下舍入为最近整数

    Trunc:去零取整

    Step:比较,输出0或1,用来区分出每一层的明暗,输出的是黑白纹理

    If:条件

    Frac:取小数部分,此节点在与 Time(时间)节点一起使用时非常有用,会随时间变化带来锯齿波

    Fmod:取模,输出 [A] 除以 [B] 的余数

    Clamp:限定范围

    Lerp:插值,如果 [T] 为两者间的任一值,则将输入两者的线性混合

    Posterize:色调分离,基于经过 [Steps] 的值对值进行四舍五入取整。
    [Steps] 值为 5 时将在 0 到 1 的范围内创建 5 段

    Blend:混合,有不同的混合方式,用时查看API

    Remap:重映射,将值从一个范围重映射到另一个范围,用来加深或减弱

    Noise:噪音,根据两分量输入(例如 UV 坐标)生成伪随机点

    One Minus:1 减,输出 1 减去其输入。与颜色输入一起使用时,将反转颜色

    Negate:取反,输出其主输入乘以 -1。实质上让正值变负,让负值变正

    Component Mask :分量遮罩,遮罩某个通道

    Channel Blend :通道混合

    Fresnel:菲涅耳,边缘亮显的效果

    更多具体的节点信息,可以查看官方的说明
    节点详细信息
    绿色的节点,代表是可以进行编辑的属性,就是可以显示到Inspector面板。

    5.其他中间黑色区域为节点编辑区域
    用于创建和编辑节点。下面通过操作介绍来演示。

    3.界面操作基本介绍

    这里写图片描述
    打开着色器=Windows>Shader Forge
    平移=单击(左键或者中键)并拖动空白空间
    缩放=鼠标滚轮
    添加节点
    1.右键弹出节点分类,进行选择。

    2.节点首字母 +选择节点或从右面板拖动并放置或保存节点名的第一个字母,然后滚动到所需的节点,然后单击(需要开始预览区域的相关设置)
    这里写图片描述
    移动节点=单击和拖动
    选择节点=单击以选择、移动/控制单击以添加到选择
    框选择节点=按住Alt +拖动。移动/控制点击添加到选择
    这里写图片描述
    删除节点=选择并按下删除
    删除连接=按住Alt键并在连接线上右键滑动进行切割。
    这里写图片描述
    对于不认识的节点,右键选择what(节点树面板和节点浏览面板都支持),出现API官网,可选简体字
    这里写图片描述
    连线的数量表示数据类型,一条连线表示为单个数值(float或者int),两条连线表示Vector2(如UV),三条连线表示Vector3(如Color Position等)
    这里写图片描述

    4.练习一个简单的Shader效果

    自己创建一个Shader(无光照类型)文件,命名为MyDiffuse,并用ShaderForge打开。

    添加一个Texture 2D节点,并且连接到Doffuse通道。
    这里写图片描述

    预览面板显示为白色,这是因为我们没有选择贴图,Texture2D节点默认为白色(可更改)。
    这里写图片描述

    鼠标放到节点上,显示选择按钮进行选择纹理。(也可以直接将项目视图中的纹理拖拽过来)
    这里写图片描述

    将纹理的名字修改为 MainTex(如果以后想让贴图受到灯光贴图则必须改为这个名字)
    这里写图片描述

    这里的贴图只是为了预览使用,使用的时候还需要在Inspector面板进行重新设置。
    材质创建可以直接选中Shader然后再去右键创建材质球,可以自动生成带当前Shader的材质球。
    这里写图片描述

    在场景中添加一个球体,并且赋予当前的材质球,进行预览效果。
    这里写图片描述

    展开全文
  • Shader Forge 入门学习(一) 基础操作

    千次阅读 2018-11-21 13:51:57
    近日学习Shader Forge,记录下来,共同进步!内容主要包括ShaderForge的操作设置,并配合一些案例进行讲解。将会分成几篇博客分开记录,本篇着重于入门基础! 开发版本:Unity 2017.1.1f1 适合人群:想要制作酷炫...
  • Shader山下(一)第一个Shader

    千次阅读 2016-10-13 13:55:09
    学习Unity3D就得学Shader,然而新手学习Shader往往不知道从何处下手,没有找对门,谈何入门。 本系列主要介绍Shader的一些基础知识,希望可以带你找对门,然后入得了门。
  • 什么是Shader

    千次阅读 2011-09-04 23:50:54
    光看字面的意思「Shader」不知道是什麼玩意兒,硬翻成中文「著色器」似乎也難以摸著頭緒!剛開始接觸圖學的我完全搞不懂它有什麼作用,然後盲目地學著OpenGL:P直到老師說:「只要你學會Shader,就可以做到別人辦不...
  • ShaderShader官方示例

    千次阅读 2018-12-20 15:42:59
    Surface Shader示例 在表面着色器 。此页面上的示例显示如何使用内置照明模型。有关如何实现自定义光照模型的示例,请参阅Surface Shader光照示例。 简单着色器 例 我们将从一个非常简单的Shader开始,并在此基础上...
  • OpenGL--使用Shader

    万次阅读 2018-06-10 17:52:38
    创建Shader 关于在OpenGL中怎么创建Shader这个在很早我博客中就有过详细介绍了。这里全当复习,温故而知新~ 在OpenGL中,存在Program和Shader两个概念,Program相当于当前渲染管线所使用的程序,是Shader的容器,...
  • Shader入门-2

    千次阅读 2018-08-15 17:23:33
    Hello Shader 百行文档不如一个实例,下面给出一段简单的Shader代码,然后根据代码来验证下上面说到的结构和阐述一些基本的Shader语法。因为本文是针对Unity3D来写Shader的,所以也使用Unity3D来演示吧。首先,新建...
  • Unity Shader Graph初次尝试

    万次阅读 2020-02-24 09:56:37
    软件环境 Unity Version: 2018.1.2f1 边缘发光材质效果 创建工程 打开Unity并创建一个新工程 ... Package Manager打开包管理器,安装二个依赖包: ...2. Shader Graph Lightweight Render Pipeline ...
  • VS中添加编写Shader的工具插件

    万次阅读 2018-05-10 18:00:42
    添加完成后,重启VS编辑器,然后点击修改按钮,等待完成即可。完成。。。。。。。。。。。。。。
  • 中级Shader教程00 总纲

    万次阅读 多人点赞 2020-05-11 13:56:05
    FishMan Shader Tutorial 0.说在前面 本教程配套blog 本教程配套项目源码 教程中抽取的RayMarching框架 本人shadertoy地址 个人blog地址,更好的排版 如果想学习哪种类型的shader,可以在这里留言,我优先...
  • unity里面动态的替换shader

    万次阅读 2016-05-12 11:42:55
    原地址:... 在游戏中,怪物或者人受到攻击后,会有变白的效果。这个效果是Shader实现的。在判定被攻击的时候切换Shader。 [csharp] view plain copy
  • Unity 2018之ShaderGraph安装

    万次阅读 2019-08-15 22:01:41
    Unity 2018最新功能之一包括shader graph,在看视频介绍的时候就发现这货和UE中的材质系统相同,都是可以使用节点来进行可视化调整材质。Unity发布这个功能也算是shader入门者的福音。之后的几篇博客会对该技术进行...
  • ShaderGraph入门

    万次阅读 2018-05-23 08:59:39
    Shader一直是Unity开发者的一个难关,涉及到数学、图形学、shader语法等多个难题。不过,ShaderGraph来拯救你了!Unity2018的一个重磅功能是ShaderGraph,通过可视化界面拖拽就可以实现着色器的创建和编辑。本文基于...
  • Unity 2018之ShaderGraph使用基础

    万次阅读 2018-05-15 10:59:16
    创建shaderGraph 创建轻量级渲染管线 ShaderGraph是基于可编程渲染管线,我们要使用shaderGraph也就需要设置SRP。 首先创建Renderpipeline。在SRP中,unity帮我们封装了几种渲染管线: - 我们可以创建LWRP(轻...
  • 版本:unity 5.4.1 语言:Unity Shader Shader Forge版本:1.32   总起: 在具体介绍Shader之前准备再写一篇有关于ShaderForge的,虽然我们可能使用代码来直接编写Shader,但拥有ShaderForge这样的可视化编辑工具...
1 2 3 4 5 ... 20
收藏数 67,315
精华内容 26,926
关键字:

shader