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 (四)顶点程序示例的更多相关文章

  1. [Unity Shader] 逐顶点光照和逐片元漫反射光照

    书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...

  2. ogre3D学习基础2 -- 顶点程序与片断程序

    三.顶点程序与片断程序 顶点或者片断程序定义可以被多个材质使用,唯一的前提条件是必须在引用它之前在材质的渲染通路部分中定义. 一个低级顶点程序示例如下: vertex_program myVertex ...

  3. 第四章 开始Unity Shader学习之旅(2)

    目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...

  4. Unity容器中AOP应用示例程序

    转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...

  5. 【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...

  6. 第四章 开始Unity Shader学习之旅(1)

    1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...

  7. unity shader入门(二)语义,结构体,逐顶点光照

    下为一个逐顶点漫反射光照shader Shader "study/Chapter6/vertexShader"{ Properties{_Diffuse("Diffuse ...

  8. 【Unity Shader】一、顶点函数(vertex)和片元函数(fragment)

    学习资料:http://www.sikiedu.com/course/37/task/430/show 学习Shader中顶点函数(vertex)和片元函数(fragment)的基本用法. Shade ...

  9. unity shader base pass and additional pass

      [Unity Shaders]Shader中的光照,shadersshader 写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已 ...

随机推荐

  1. utf8 string

    https://github.com/BassLC/idUTF8lib Idiot's UTF-8 Library A very (too much really) simple Utf8 libra ...

  2. NEC芯片特别说明

    NEC芯片注意点: 1.堆栈和RAM共用,而且是程序中自定义堆栈的空间,堆栈是向下递减堆栈. 2.中断中标志位的清除可以不用手动清除,在中断服务程序中运行任何一条指令后自动清除. 3.中断服务程序有且 ...

  3. (转载)比较web ui 框架

    以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范, ...

  4. webpack中optimization 的 runtimeChunk 是干嘛的

    结论:把runtime部分的代码抽离出来单独打包 https://developers.google.com/web/fundamentals/performance/webpack/use-long ...

  5. 支持JSONP跨域的对象

    支持JSONP跨域的对象 1:img 2:iframe 3:link 4:script 为什么,JSONP 最终选择是 script 实现呢?度娘来也! 平常我们进行JSONP请求数据,因为 json ...

  6. ubuntu 16.04 安装KVM-多系统

    为了使用QQ 只能再跑一个Windows了

  7. 开源 PHP 项目找队友、顾问、指导、贡献者等等

    介绍站点还没做,先直接甩代码链接了 https://github.com/litphp/litphp Lit是什么? Lit是我一直在撸的个人框架,按第一次上传代码来说历史 超过4年 了,从还能支持P ...

  8. 题解 P3200 【[HNOI2009]有趣的数列】

    说起来这是今天第三道卡特兰数了... 楼上的几篇题解好像都是直接看出这是卡特兰数,所以我就写一下为什么这道题可以用卡特兰数吧. 考察这样相邻的两项:\(a_{2i-1}\)与\(a_{2i}\),根据 ...

  9. Qt 学习之路问题

    Qt5 cannot include the file QMainWindow add "greaterThan(QT_MAJOR_VERSION, 4): QT += widgets&qu ...

  10. 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 ...