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的光照痛恨不已 ...
随机推荐
- Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
1.最近,在学习解析json数据的时候遇到一个错误信息,错误信息如下图所示: 发现解析出来的数据为空,错误信息如上图所示,发现程序中的HttpUtils工具类的22行出现了错误和MainActiv ...
- [转] CentOS 7 为firewalld添加开放端口及相关资料
转自http://www.cnblogs.com/hubing/p/6058932.html 1.运行.停止.禁用firewalld 启动:# systemctl start firewalld 查 ...
- POJ 3264 Balanced Lineup【线段树】
题意:给出n个数,a1,a2,a3,---,an,再给出q次询问区间al到ar之间的最大值和最小值的差 学习线段树的第一道题目 学习的这一篇 http://www.cnblogs.com/kuangb ...
- lua中调用C++函数
lua中调用C++函数 我们产品中提供了很多lua-C API给用户在lua中调用,之前一直没用深究其实现原理,只是根据已有的代码在编码.显然这不是一个好的习惯,没用达到知其所以然的目的. 一.基本原 ...
- 使用dispatch_group来进行线程同步
我的上篇文章iOS中多个网络请求的同步问题总结中用到了dispatch_group来进行线程同步,对用法不是特别熟悉所以整理这篇文章来加深记忆(闲着也是闲着). 一.简单介绍下将会用到的一些东西 英语 ...
- js判断浏览器的环境(pc端,移动端,还是微信浏览器)
window.navigator.userAgent用来区分设备和浏览器 <!DOCTYPE html> <html> <head> <meta charse ...
- NodeJS学习笔记 (4)网络服务-http(ok)
原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...
- indexedDB介绍
什么是 indexedDB IndexedDB 是一种使用浏览器存储大量数据的方法.它创造的数据可以被查询,并且可以离线使用. IndexedDB对于那些需要存储大量数据,或者是需要离线使用的程序是非 ...
- 树上倍增求LCA
大概思想就是,节点$i$的第$2^{j}$个父节点是他第$2^{j-1}$个父亲的第$2^{j-1}$个父亲 然后可以$O(nlogn)$时间内解决…… 没了? //fa[i][j]表示i的第2^j个 ...
- [洛谷P1920]成功密码
题目大意:给你n和x($n\leq 10^{18},0<x\leq 1$),要你求$\sum_{i=1}^n\frac{x^i}{i}$. 解题思路:首先n大到要用long long存,暴力肯定 ...