一、Vertex&Frag

  包含Vertex&Fragment 的Shader叫做顶点&像素着色器,在Vertex的功能函数中,我们侧重于几何计算,如纹理坐标,顶点坐标等;在Fragment 的功能函数中,我们侧重于计算最终的颜色值,如光照后的效果等,注意这里会对像素进行平滑插值。

二、Vertex&Frag 的结构

Shader "JQM/Test01"
{
Properties
{
   ...
}
SubShader
{
       ...
}
SubShader
{
       ...
}
...
}

  在第一行:Shader "JQM/Test01",声明了着色器的名字和路径;然后在它的大括号内包含一个属性和多个SubShader;

  

  在Shader的计算中,每个Shader会根据计算机硬件系统自己的条件选择一个合适SubShader运行。每一个SubShader可以包含多个Pass通道,每一个Pass依次计算,多个Pass之间我们会采用混合技术来合理使用,这样可以制作更多的特效,在Pass中,就是具体的计算方法了,Vertex&Frag就在Pass中。

    SubShader
{
Pass
{
...
}
Pass
{
...
}
...
}

三、Properties {} 属性介绍

  在Properties作用域中,包含着一些属性,如纹理、颜色浮点值等,以下是属性类型。但是要使用这些属性值,需要在CG块中声明一次。Unity 圣典属性

    Properties
{
_MyTexture ("Texture", 2D) = "white" {} //纹理
_MyColor ("Some Color", Color) = (,,,) //颜色
_MyVector ("Some Vector", Vector) = (,,,) //4维坐标
_MyFloat ("My float", Float) = 0.5 //浮点
_MyRange ("My Range", Range(,)) = 0.5 //浮点
_MyCubemap ("Cubemap", CUBE) = "" {} //立方体纹理
}

四、Pass {} 介绍  

        Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct VertexOutput
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0; }; sampler2D _MainTex;
float4 _MainTex_ST; VertexOutput vert (appdata_full v)
{
VertexOutput o;
...
return o;
} fixed4 frag (VertexOutput i) : COLOR
{
fixed4 col = tex2D(_MainTex, i.uv);
...
return col;
}
ENDCG
}

  在Pass中,CGPROGRAM...ENDCG里面,所有的功能代码,都在该区域内。在CGPROGRAM...ENDCG中,先声明顶点着色器vert和像素着色器frag,具体的计算在函数里面。然后是包含Unity的Cg头文件,一些内置变量在纹理里面。还定义了自己的结构体用于顶点着色器向像素着色器传递信息。如果要使用属性值,需要在该区域里面声明。

五、完整例子解析

如下图:先通过顶点着色器,计算模型的坐标和纹理,再传入像素着色器计算颜色值。

*注意

_MainTex_ST 和 TransForm_Tex 是对应关系,计算纹理坐标的偏移和平铺。

裁剪空间的范围是[-1,1],也就是在经过MVP矩阵后,o.pos.x/ o.pos.w 以及o.pos.y/ o.pos.w 的范围都是[-1,1] 故可以将裁剪空间坐标转换为 相对屏幕位置的uv坐标,如下o.uv = float2(( o.pos.x/o.pos.w+1)*0.5,(o.pos.y/o.pos.w+1)*0.5);

源代码:

 Shader "JQM/VertexAndFrag"                                            //文件名和路径
{
Properties //属性
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{ Pass
{
CGPROGRAM //Vertex&Frag 类型的shader 采用Cg语言
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; //属性声明
float4 _MainTex_ST; struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 pos:SV_POSITION;
float2 uv : TEXCOORD0;
}; v2f vert (appdata v) //顶点程序
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex); //模型视图投影矩阵,将模型坐标转到摄像机坐标,在投影到屏幕的坐标
o.uv = TRANSFORM_TEX(v.uv, _MainTex); //计算UV和贴图之间的值
return o;
} fixed4 frag (v2f i) : COLOR //片段程序,强制返回Color类型的颜色值
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); //纹理采样
return col;
}
ENDCG
}
}
}

图像特效脚本

Vertex&Frag的更多相关文章

  1. Unity3d 实时折射和反射

    这里只是张贴在实时折射和脚本反思shader, 大约NGUI第一部分请下载. 这个版本的主要缺点是折射平面部Layer必须是water层.假设有专家谁可以摆脱这一个.请记得把代码回该条,谢谢! Wat ...

  2. Unity3d 镜面反射 vertex and frag Shader源代码

    Unity3d 镜面反射 网上能找到的基本上是固定管道或表面渲染的shader. 特此翻译为顶点.片段渲染的Shader, 本源代码仅仅涉及shader与cs部分. Editor部分使用NGUI绘制的 ...

  3. Unity3d 镜面折射 vertex and frag Shader源代码

    Unity3d 镜面折射  网上能找到的基本上是固定管道或表面渲染的shader. 特此翻译为顶点.片段渲染的Shader, 本源代码仅仅涉及shader与cs部分, 请自行下载NGUI  unity ...

  4. Vertex and Fragment Shader

    Semantics语义词: 定义:GPU工作时,数据通常暂存在寄存器,那么在Cg中,语义词就指定了输入/输出数据和图形硬件寄存器之间的映射关系. 原理:根据输入语义,图形处理器从某个寄存器取数据:然后 ...

  5. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  6. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  7. Vertex中实现每顶点光照的镜面高光效果

    1,基础知识讲解 一个物体在自然界会收到三种光的影响,周围的环境光.漫反射和镜面反射.那么对于计算机要想模拟现实中的光照,就应该也会实现这三种基本光照->环境光.漫反射.镜面高光.对于这三种光照 ...

  8. Unity cg vertex and fragment shaders(二)

    着色器的一般结构: Shader "MyShader/MyShaderName" { Properties { // ... properties here ... } SubSh ...

  9. Unity cg vertex and fragment shaders(一)

    cg片段 Cg程序片段写CGPROGRAM和ENDCG之间 开始时的片段可以作为#pragma语句编译指令 Pass { // ... the usual pass state setup ... C ...

随机推荐

  1. iOS APNs远程推送流程精简版

    1.去Apple Developer Center里创建应用的信息,指定APP ID(Bundle ID),配置里开启推送功能(Push Notifications). 后续步骤需要用到这个应用的包名 ...

  2. python_os.path模块用法

    python中os.path模块用法: dirname()  用于去掉文件名,返回目录所在的路径 >>> import os >>> os.path.dirname ...

  3. ZooKeeper通过ACL修复未授权访问漏洞

    默认情况下ZooKeeper允许匿名访问,因此在安全漏洞扫描中暴漏未授权访问漏洞. 一.参考资料 <ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表& ...

  4. Hackonacci Matrix Rotations 观察题 ,更新了我的模板

    https://www.hackerrank.com/contests/w27/challenges/hackonacci-matrix-rotations 一开始是没想到观察题的.只想到直接矩阵快速 ...

  5. java数据结构和算法05(二叉树)

    对于树这个数据结构,第一次看到这个树肯定是一脸蒙逼,玛德,树?种树的那个树么?哈哈哈,当然不是,前面我们说过数组添加.删除数据很慢,查询数据很快:而链表添加.删除数据很快,但是查找数据很慢,我们就想啊 ...

  6. 2019PAT春季考试第4题 7-4 Structure of a Binary Tree (30 分)

    题外话:考试的时候花了一个小时做了27分,由于Siblings这个单词不知道意思,所以剩下的3分就没去纠结了,后来发现单词是兄弟的意思,气哭~~ 这道题的麻烦之处在于如何从一个字符串中去找数字.先首先 ...

  7. iOS-控件响应用户控制事件之事件处理

    事件处理 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewControlle ...

  8. Farseer.net轻量级ORM开源框架 V1.2.1版本升级消息

    提交版本V1.2.11.修复实体未设置主键时,无法找到主键ID字段,改为无主键时默认为"ID”字段2.新增:SqlServer2000Provider数据库驱动3.新增:DbContextI ...

  9. asterisk-java ami5 分机状态,挂机原因之类的

    这些东西网上随便一找一大堆,也只是记录下自己找的.方便以后自己复制粘贴用. 最后为啦实现分机状态在web的实时更新,我选择啦使用websocket. //获得分机状态 public static St ...

  10. 洛谷 P3371 【模板】单源最短路径(堆优化dijkstra)

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...