Unity Shader (四)顶点程序示例
1、在顶点函数中实现凸起效果

Shader "Custom/Example" {
properties
{
_R("R",range(,))= //圆的半径,也是凸起的范围
_OX("OX",range(-,))= //x轴
}
SubShader
{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float _R;
float _OX;
struct v2f{
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v)
{
float4 wpos=mul(unity_ObjectToWorld,v.vertex);//将顶点转换为世界坐标
float2 xy=wpos.xz;//获取顶点的x轴和z轴
float d=_R-length(xy-float2(_OX,));//length用于求向量的模长
d=d<?:d;
float4 uppos=float4(v.vertex.x,d,v.vertex.z,v.vertex.w);
v2f o;
o.pos=UnityObjectToClipPos(uppos);//等于mul(UNITY_MATRIX_MVP,uppos)
o.color=fixed4(uppos.y/_R,uppos.y/_R,uppos.y/_R,);
return o;
}
fixed4 frag(v2f IN):COLOR
{
return IN.color;
}
ENDCG
}
}
}
2、渐变及溜光效果

Shader "Custom/Example_1" {
properties
{
_r("R",range(,))=0.1
}
Subshader
{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float dis;
float _r;
struct v2f{
float4 pos:POSITION;
fixed4 color:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
float x=o.pos.x/o.pos.w;
dis=_SinTime.y*;
if(x>dis&&x<dis+_r)
o.color=fixed4(,,,);
else
o.color=fixed4(x/+0.5,x/+0.5,x/+0.5,);
return o;
}
fixed4 frag(v2f IN):COLOR
{
return IN.color;
}
ENDCG
}
}
}
3、顶点扭曲效果


Shader "Custom/Example_2" {
Subshader
{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
v2f vert(appdata_base v)
{
// float angle=length(v.vertex)*_SinTime.w;
// //绕Y轴旋转矩阵
// float4x4 m=
// {
// float4(cos(angle),0,sin(angle),0),
// float4(0,1,0,0),
// float4(-sin(angle),0,cos(angle),0),
// float4(0,0,0,1),
// };
// v.vertex=mul(m,v.vertex);//旋转矩阵去影响顶点
// //优化绕Y轴旋转的矩阵,除去0与其他项相乘的项
// float x=cos(angle)*v.vertex.x+sin(angle)*v.vertex.z;
// float z=-sin(angle)*v.vertex.x+cos(angle)*v.vertex.z;
// v.vertex.x=x;
// v.vertex.z=z;
//边界波纹效果
float angle=v.vertex.z+_Time.y;
float4x4 m=
{
float4(sin(angle)/+0.5,,,),
float4(,,,),
float4(,,,),
float4(,,,),
};
v.vertex=mul(m,v.vertex);
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=fixed4(,,,);
return o;
}
float4 frag(v2f IN):COLOR
{
return IN.color;
}
ENDCG
}
}
}
4、各种波



Shader "Custom/Example_3" {
Subshader
{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
v2f vert(appdata_base v)
{
//简谐运动公式 A*sin(w*x+t)
//旗帜波
// v.vertex.y+=0.2*sin(v.vertex.x+_Time.y);
//涟漪
// v.vertex.y+=0.2*sin(-length(v.vertex.xz)*2+_Time.y);
//水波
v.vertex.y+=0.2*sin((v.vertex.x+v.vertex.z)+_Time.y);
v.vertex.y+=0.3*sin((v.vertex.x-v.vertex.z)+_Time.w);
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=fixed4(v.vertex.y,v.vertex.y,v.vertex.y,);
return o;
}
float4 frag(v2f IN):COLOR
{
return IN.color;
}
ENDCG
}
}
}
5、漫反射+环境光


Shader "Custom/Example_4" {
Subshader
{
pass{
tags{"LightMode"="Forwardbase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
//利用顶点程序计算光照执行效率高,片段程序计算光照略慢但更细腻平滑
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
float3 N=normalize(v.normal);//归一化顶点的法向量
float3 L=normalize(_WorldSpaceLightPos0);//归一化光线
//法向量和光向量需要处于同一个坐标空间
N=mul(float4(N,0),unity_WorldToObject).xyz;//方案一,将法向量变换到世界空间
N=normalize(N);//还需再规范化一下
// L=mul(unity_WorldToObject,float4(L,0)).xyz;//方案二,将光向量变换到模型空间
float NdotL=saturate(dot(N,L));//点乘得到向量N,L的余弦值,saturate得到0-1的值,负数为0
o.color=_LightColor0*NdotL;//得到光照强度
//添加点光源光照
float3 wpos=mul(unity_ObjectToWorld,v.vertex).xyz;
o.color.rgb+=Shade4PointLights(
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightColor[0].rgb,unity_LightColor[1].rgb,
unity_LightColor[2].rgb,unity_LightColor[3].rgb,
unity_4LightAtten0,
wpos,N
);
return o;
}
float4 frag(v2f IN):COLOR
{
return IN.color+UNITY_LIGHTMODEL_AMBIENT;//漫反射+环境光
}
ENDCG
}
}
}

6、高光


Shader "Custom/Example_5" {
Subshader
{
pass{
tags{"LightMode"="Forwardbase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
//利用顶点程序计算光照执行效率高,片段程序计算光照略慢但更细腻平滑
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
float3 N=normalize(v.normal);//归一化顶点的法向量
float3 L=normalize(_WorldSpaceLightPos0);//归一化光线
//法向量和光向量需要处于同一个坐标空间
N=mul(float4(N,0),unity_WorldToObject).xyz;//方案一,将法向量变换到世界空间
N=normalize(N);//还需再规范化一下
//Diffuse Color漫反射
float NdotL=saturate(dot(N,L));//点乘得到向量N,L的余弦值,saturate得到0-1的值,负数为0
o.color=_LightColor0*NdotL;//得到光照强度
//Specular Color高光
float3 I=-WorldSpaceLightDir(v.vertex);
float3 R=reflect(I,N);//I为入射光,N是顶点法向量
float3 V=WorldSpaceViewDir(v.vertex);//摄像机到顶点的方向
R=normalize(R);
V=normalize(V);
float specularScale=pow(saturate(dot(R,V)),10);//向量R和向量V之间的夹角,指数形式衰减
o.color.rgb+=_LightColor0*specularScale;
return o;
}
float4 frag(v2f IN):COLOR
{
return IN.color+UNITY_LIGHTMODEL_AMBIENT;//漫反射+环境光
}
ENDCG
}
}
}

Unity Shader (四)顶点程序示例的更多相关文章
- [Unity Shader] 逐顶点光照和逐片元漫反射光照
书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...
- ogre3D学习基础2 -- 顶点程序与片断程序
三.顶点程序与片断程序 顶点或者片断程序定义可以被多个材质使用,唯一的前提条件是必须在引用它之前在材质的渲染通路部分中定义. 一个低级顶点程序示例如下: vertex_program myVertex ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- Unity容器中AOP应用示例程序
转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...
- 【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 第四章 开始Unity Shader学习之旅(1)
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...
- unity shader入门(二)语义,结构体,逐顶点光照
下为一个逐顶点漫反射光照shader Shader "study/Chapter6/vertexShader"{ Properties{_Diffuse("Diffuse ...
- 【Unity Shader】一、顶点函数(vertex)和片元函数(fragment)
学习资料:http://www.sikiedu.com/course/37/task/430/show 学习Shader中顶点函数(vertex)和片元函数(fragment)的基本用法. Shade ...
- unity shader base pass and additional pass
[Unity Shaders]Shader中的光照,shadersshader 写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已 ...
随机推荐
- utf8 string
https://github.com/BassLC/idUTF8lib Idiot's UTF-8 Library A very (too much really) simple Utf8 libra ...
- NEC芯片特别说明
NEC芯片注意点: 1.堆栈和RAM共用,而且是程序中自定义堆栈的空间,堆栈是向下递减堆栈. 2.中断中标志位的清除可以不用手动清除,在中断服务程序中运行任何一条指令后自动清除. 3.中断服务程序有且 ...
- (转载)比较web ui 框架
以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范, ...
- webpack中optimization 的 runtimeChunk 是干嘛的
结论:把runtime部分的代码抽离出来单独打包 https://developers.google.com/web/fundamentals/performance/webpack/use-long ...
- 支持JSONP跨域的对象
支持JSONP跨域的对象 1:img 2:iframe 3:link 4:script 为什么,JSONP 最终选择是 script 实现呢?度娘来也! 平常我们进行JSONP请求数据,因为 json ...
- ubuntu 16.04 安装KVM-多系统
为了使用QQ 只能再跑一个Windows了
- 开源 PHP 项目找队友、顾问、指导、贡献者等等
介绍站点还没做,先直接甩代码链接了 https://github.com/litphp/litphp Lit是什么? Lit是我一直在撸的个人框架,按第一次上传代码来说历史 超过4年 了,从还能支持P ...
- 题解 P3200 【[HNOI2009]有趣的数列】
说起来这是今天第三道卡特兰数了... 楼上的几篇题解好像都是直接看出这是卡特兰数,所以我就写一下为什么这道题可以用卡特兰数吧. 考察这样相邻的两项:\(a_{2i-1}\)与\(a_{2i}\),根据 ...
- Qt 学习之路问题
Qt5 cannot include the file QMainWindow add "greaterThan(QT_MAJOR_VERSION, 4): QT += widgets&qu ...
- COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛
http://www.lydsy.com/JudgeOnline/problem.php?id=1776||http://cogs.pro/cogs/problem/problem.php?pid=8 ...