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的光照痛恨不已 ...
随机推荐
- P3809 【模版】后缀排序
题目背景 这是一道模版题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- LeetCode 190. Reverse Bits (算32次即可)
题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...
- 利用IP安全策略关闭危险端口
默认情况下,Windows服务器有很多端口是开放的,网络病毒和黑客可以通过这些端口连上你的服务器并进行攻击. 为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135.139.445.59 ...
- 四个例子实战讲解.htaccess文件rewrite规则(转)
一.防盗链功能 1 2 3 4 RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC] Rewrite ...
- 洛谷P1136 迎接仪式 动态规划
显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...
- python自动化报错
今天使用python.然而遇见了报错.抓狂的一笔.有说path写错的,有说是...网上查到的资料也是很少.后来突然发现,页面上我暂时能看到的元素可以定位并进行操作.看不到的无法进行...ps此时我没有 ...
- LightOJ-1074 Extended Traffic 最短路问题 注意连通性
题目链接:https://cn.vjudge.net/problem/LightOJ-1074 题意 给一图 求最短路 若最短路<3或没有最短路,则输出'?' 思路 首先注意到可能存在负环,所以 ...
- js去掉字符串得第一个字符 、去掉字符串的最后一个字符
a1 = aa[0].slice(1); //去掉第一个字符串 a2 = a2.substr(0, a2.length - 1);
- linux在线添加硬盘、扫盘
1:查看scsi 硬盘设备[root@web02 ~]# ls /sys/class/scsi_host host0 host1 host2 2:检查本机现有硬盘 [root@web02 ~]# fd ...
- swoole之memoryGlobal内存池分析
内存池的作用: 直接使用系统调用malloc会有如下弊端: 频繁分配内存时会产生大量内存碎片 频繁分配内存增加系统调用开销 容易造成内存泄漏 内存池是预先申请一定数量的,大小相等的内存块作为预备使用: ...