Unity Shader (四)片段程序示例
1、环境光+漫反射+高光+点光源

Shader "Custom/Example_Frag_1" {
    properties
    {
        _MainColor("Main Color",color)=(,,,)
        _SpecularColor("Specular Color",color)=(,,,) //高光颜色
        _Shininess("Shininess",range(,))= //高光范围
    }
    Subshader
    {
        pass{
            tags{"LightMode"="Forwardbase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"
            float4 _MainColor;
            float4 _SpecularColor;
            float _Shininess;
            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD1;
                fixed4 vertex:COLOR;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                //Ambinet color 环境光
                fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
                //Diffuse Color 漫反射光 dot(N,L)
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                float diffuseScale=saturate(dot(N,L));
                col+=_LightColor0*_MainColor*diffuseScale;
                //Specular Color 高光
                float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                float3 R=*dot(N,L)*N-L;//反射光,方案一
//                float3 I=-WorldSpaceLightDir(IN.vertex);
//                float3 R=reflect(I,N);//反射光,方案二
                float specularScale=saturate(dot(R,V));
                col+=_SpecularColor*pow(specularScale,_Shininess);
                //compute 4 points lighting 点光源
                float3 wpos=mul(_Object2World,IN.vertex).xyz;
                col.rgb+=Shade4PointLights
                (
                    unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                    unity_LightColor[].rgb,unity_LightColor[].rgb,unity_LightColor[].rgb,unity_LightColor[].rgb,
                    unity_4LightAtten0,
                    wpos,N
                );
                return col;//漫反射+环境光
            }
            ENDCG
        }
    }
}
2、阴影

Shader "Custom/Example_Frag_2" {
    properties
    {
        _MainColor("Main Color",color)=(,,,)
        _SpecularColor("Specular Color",color)=(,,,) //高光颜色
        _Shininess("Shininess",range(,))= //高光范围
    }
    Subshader
    {
//        pass
//        {
//            tags{"LightMode"="shadowcaster"}//这种方式只能为方向光添加投射阴影
//        }
        pass{
            tags{"LightMode"="Forwardbase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"
            float4 _MainColor;
            float4 _SpecularColor;
            float _Shininess;
            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD1;
                fixed4 vertex:COLOR;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                //Ambinet color 环境光
                fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
                //Diffuse Color 漫反射光 dot(N,L)
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                float diffuseScale=saturate(dot(N,L));
                col+=_LightColor0*_MainColor*diffuseScale;
                //Specular Color 高光
                float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                float3 R=*dot(N,L)*N-L;//反射光,方案一
//                float3 I=-WorldSpaceLightDir(IN.vertex);
//                float3 R=reflect(I,N);//反射光,方案二
                float specularScale=saturate(dot(R,V));
                col+=_SpecularColor*pow(specularScale,_Shininess);
                //compute 4 points lighting 点光源
                float3 wpos=mul(unity_ObjectToWorld,IN.vertex).xyz;
                col.rgb+=Shade4PointLights
                (
                    unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                    unity_LightColor[].rgb,unity_LightColor[].rgb,unity_LightColor[].rgb,unity_LightColor[].rgb,
                    unity_4LightAtten0,
                    wpos,N
                );
                return col;//漫反射+环境光
            }
            ENDCG
        }
    }
    //取巧的方法是,让其回滚到系统自带的Diffuse中,
    //这样既可以产生方向光阴影,点光源也可以产生阴影
    fallback "Diffuse"
}
3、镂空效果

Subshader
{
Tags{"Queue"="Transparent"}
pass{
blend srcAlpha oneMinussrcalpha
zwrite off CGPROGRAM #pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc" float _Scale; struct v2f
{
float4 pos:POSITION;
float3 normal:TEXCOORD0;
fixed4 vertex:TEXCOORD1;
}; v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.normal=v.normal;
o.vertex=v.vertex;
return o;
}
float4 frag(v2f IN):COLOR
{
float3 N=UnityObjectToWorldNormal(IN.normal);
float3 V=UnityWorldSpaceViewDir(IN.vertex);
float bright=1.0-saturate(dot(N,V));
bright=pow(bright,_Scale);
return fixed4(,,,)*bright;
} ENDCG
}
} }
4、描边

Shader "Custom/Example_Frag_4" {
    properties
    {
        _MainColor("MainColor",color)=(,,,)
        _Scale("Scale",range(,))=
        _Outer("Outer",range(,))=0.2
    }
    Subshader
    {
        Tags{"Queue"="Transparent"}
        pass{
            blend srcAlpha oneMinussrcalpha
            zwrite off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            float4 _MainColor;
            float _Scale;
            float _Outer;
            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                fixed4 vertex:TEXCOORD1;
            };
            v2f vert(appdata_base v)
            {
                v.vertex.xyz+=v.normal*_Outer;
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 V=UnityWorldSpaceViewDir(IN.vertex);
                float bright=saturate(dot(N,V));
                bright=pow(bright,_Scale);
                _MainColor.a*=bright;
                return _MainColor;
            }
            ENDCG
        }
    pass{
            blendop revsub
            blend dstalpha one
            zwrite off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            struct v2f
            {
                float4 pos:POSITION;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                return fixed4(,,,);
            }
            ENDCG
        }
        pass{
            blend srcAlpha oneMinussrcalpha
            zwrite off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            float _Scale;
            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                fixed4 vertex:TEXCOORD1;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 V=UnityWorldSpaceViewDir(IN.vertex);
                float bright=saturate(dot(N,V));
                bright=pow(bright,_Scale);
                return fixed4(,,,)*bright;
            }
            ENDCG
        }
    }
}
5、贴图及光照贴图

Shader "Custom/Example_Frag_6" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
                float2 uv_lighting:TEXCOORD1;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//让属性面板中的Tiling和Offset起作用,这里需要声明 _ST 后缀的变量,这里是_MainTex_ST
                o.uv_lighting=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//使用光照贴图
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float3 lm=DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,IN.uv_lighting));//解码光照贴图
                fixed4 color=tex2D(_MainTex,IN.uv);
                color.rgb*=lm;
                return color;
            }
            ENDCG
        }
    }
}
6、波

Shader "Custom/Example_Frag_7" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _F("F",range(,))=
        _A("A",range(,0.1))=0.01
        _R("R",range(,))=
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _F;
            float _A;
            float _R;
            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
//                IN.uv+=0.01*sin(IN.uv*3.14*_F+_Time.y);//水波
                float2 uv=IN.uv;
                float dis=distance(uv,float2(0.5,0.5));
                float scale=;
                _A*=saturate(-dis/_R);
                scale=_A*sin(-dis*3.14*_F+_Time.y);//圆形涟漪
                uv=uv+uv*scale;
                fixed4 color=tex2D(_MainTex,uv);
                return color;
            }
            ENDCG
        }
    }
}
7、模糊

Shader "Custom/Example_Frag_8" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _F("F",range(,))=
        _A("A",range(,0.1))=0.01
        _R("R",range(,))=
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #pragma target 3.0
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _F;
            float _A;
            float _R;
            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
                float z:TEXCOORD1;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.z=mul(unity_ObjectToWorld,v.vertex).z;
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float2 dsdx=ddx(IN.z)*;
                float2 dsdy=ddy(IN.z)*;
                fixed4 color=tex2D(_MainTex,IN.uv,dsdx,dsdy);//越正对的面越清晰,背对着的面模糊
                return color;
            }
            ENDCG
        }
    }
}
Unity Shader (四)片段程序示例的更多相关文章
- Unity Shader (四)顶点程序示例
		1.在顶点函数中实现凸起效果 Shader "Custom/Example" { properties { _R(,))= //圆的半径,也是凸起的范围 _OX(,))= //x轴 ... 
- Unity容器中AOP应用示例程序
		转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ... 
- 第四章 开始Unity Shader学习之旅(2)
		目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ... 
- 第四章 开始Unity Shader学习之旅(1)
		1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ... 
- 【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
		笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ... 
- Unity Shader 学习之旅
		Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ... 
- Unity Shader着色器优化
		https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ... 
- Unity Shader 基础
		推荐: https://www.cnblogs.com/nanwei/p/7277417.html 上面链接作者的整个系列都写的不错 https://www.cnblogs.com/nanwei/ca ... 
- 【Unity Shader】---UnityShader 提供的CG/HLSL语义
		一.语义的解释 语义,其实就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义.通俗的讲这些语义可以让Shader知道从哪读取输送到哪里去,他们是在CG/HLSL的shader流 ... 
随机推荐
- 优化长的switch语句
			突然想到之前碰到的一个优化的面试题,现在想想switch用的太傻 public enum FormatType { GetKey, GetValue } public class Format { p ... 
- Servlet中文乱码原因 解决 Get 和 Post 和客户端
			一.Get方式的中文乱码 1) 使用如下页面表单内容: <form action="http://127.0.0.1:8080/day07/params" method=&q ... 
- layui计算剩余时间
			<div id="test"></div> <script> layui.use('util', function(){ var util = ... 
- 小程序自定义tabbar
			代码片段: wechatide://minicode/IUoCyemJ7D3d GitHub: https://github.com/WozHuang/Miniprogram-Demo/tree/ma ... 
- (52)KeyError错误
			当出现:22KeyError: 'xxxxxx'这样的错误,可以肯定依赖出问题了,一般是你引用某个字段,但没有定义,又没有指定依赖的模块,最后找不到对应字段 解决方法:开发工具,把 xxxxxx 去搜 ... 
- matlab 中语句 a(b)的意思
			a=[1 2; 3, 4; 5, 6]; b=[1 3 2 1; 1 2 4 2]; c=a(b) c = 1 5 3 1 1 3 ... 
- CentOS6.3从光盘安装gcc(更改yum源)[转]
			转自:http://www.linuxidc.com/Linux/2012-11/73826.htm 一.加载光盘镜像 加载本地bin-DVD镜像文件到虚拟机系统,如图所示: 二.更改yum源 1.挂 ... 
- OpenStack-API开发
			介绍两种OpenStack-API(Java版)--jcoulds && openstack4j Jclouds 1.介绍 jclouds -该API提供云计算环境的可移植抽象层以及云 ... 
- ubuntu下不用拔盘就可以重新识别usb设备
			#!/bin/sh # Usage: ./resetusb ARGUMENT(The keyword for your usb device) var1=$ keyword=${var1:=Stora ... 
- SQL Server 性能调优2 之索引(Index)的建立
			前言 索引是关系数据库中最重要的对象之中的一个,他能显著降低磁盘I/O及逻辑读取的消耗,并以此来提升 SELECT 语句的查找性能.但它是一把双刃剑.使用不当反而会影响性能:他须要额外的空间来存放这些 ... 
