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流 ...
随机推荐
- 获取新浪微博的Access_token
最近想爬取新浪微博的评论,百度了一下,有个新浪开放平台提供了这个API 于是按照它的说明,去获取Access_token: 1.点击微链接 2.立即创建微链接 3.选择网页应用 4.填写信息后提交 5 ...
- win10关闭更新
计算机--管理: 找到windows update 服务关闭:
- map、栈————下一个更大的元素(待定,栈解法学习中)
方法一 先遍历nums2,将每个元素后面第一个大的元素一起存入到map中,然后在遍历nums1,在map中找到. class Solution { public: vector<int> ...
- WebKit.NET-0.5简单应用
最近想用c#做个简单的浏览器工具,但是网站一些内容不支持c#内置的WebBowser控件,于是只能改用其他内核浏览器进行开发,搜索到WebKit.NET这个封装好的浏览器引擎,需求的功能也都有,于是用 ...
- 【转载】02-PowerDesigner的下载及安装
原创路径:https://blog.csdn.net/ruyu00/article/details/79842807 一.下载 下载路径:https://pan.baidu.com/s/1WD7QHT ...
- c++PrimerChap8IO库
#include<iostream> #include<fstream> #include<string> using namespace std; int mai ...
- thttpd 在S3C6410的移植-web服务程序的应用
1. 在VMWare 虚拟机上将arm-linux-gcc 4.3.1配置好:2. 下载thttpd软件包并解压:3. 在thttpd根目录下运行: ./configure:4. ...
- 【转】C# 正则表达式大全
[转]C# 正则表达式大全 前言 在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式) 在线下载 密码:5tpt 注:好像也是一位园友 ...
- 如何成为一个偷懒又高效的Android开发人员
我敢肯定你对这个标题肯定心存疑惑,但事实就是如此,这个标题完全适合Android开发人员.据我所知, Android程序员不情愿写 findViewById().点击事件监听等重复率较高的代码.那我们 ...
- github git.exe位置
C:\Users\yourname\AppData\Local\GitHub\PortableGit_69703d1db91577f4c666e767a6ca5ec50a48d243\bin\git. ...