Shader1.0 和 Shader2.0 的区别:
不同点: 2.0 可以实现编程
相同点: 渲染管线一样
顶点片元着色器:
1.控制灵活,但是不能参与光照计算;
2.在着色器中插入Cg代码段,编写在CGPROGRAM 与 ENDCG之间;
3.编译指令:#pragma 控制 着色器代码编译;
#pragma vertex name 将名为name的函数编译为顶点着色器(入口函数);
#pragma fragment name 将名为name的函数编译为片元(像素)着色器((入口函数);
4.参数和返回值由语义修饰
Shader 2.0 编写 详解:
#pragma vertex vert // 定义一个顶点着色器的 入口函数
#pragma fragment frag // 定义一个片段着色器的 入口函数
pragma 关键字
vertex 关键字
fragment 关键字
vert 变量名
frag 变量名
#include “UnityCG.cginc” // 引入一个cg库
include 关键字
v2f vert (appdata v)
appdata : 从 meshrender 里面获取来的
v2f : 顶点着色器的 输出值 片段着色器的 输出值
常用语义:
1.POSITION: 获取模型顶点的信息(位置)。
2.TANGENT:获取切线信息。
3.NORMAL: 获取法线信息。
4.TEXCOORD (n 也称UV): 高精度的 从 顶点传递信息 到 片段着色器。(float2 float3 float4)
TEXCOORD0:第一套纹理
TEXCOORD1:第二套纹理
TEXCOORD2:第三套纹理
5.COLOR: 颜色,低精度 从顶点传递信息 到 片段着色器。(float4)
6.SV_POSITION: 表示 已经经过 mvp 矩阵 转换到 屏幕坐标的位置。
7.SV_TARGET: 输出到 哪个 render target、
顶点着色器 从 fbx 获取 信息(Unity 默认定义好的几个顶点着色器获取信息):
struct appdata_base
{
float4 vertex:POSITION;
float3 normal: NORMAL;
float4 texcoord:TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan
{
float4 vertex:POSITION;
float4 tangent:TANGENT;
float3 normal: NORMAL;
float4 texcoord:TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full
{
float4 vertex:POSITION;
float4 tangent:TANGENT;
float3 normal: NORMAL;
float4 texcoord:TEXCOORD0;
float4 texcoord1:TEXCOORD1;
float4 texcoord2:TEXCOORD2;
float4 texcoord3:TEXCOORD3;
fixed4 color: COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
编写详解(博主用CG为例 ):
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include “UnityCG.cginc”
struct appdata // 自定义 一个顶点获取信息
{
float4 vertex: POSITION;
float2 uv: TEXCOORD0;
};
struct v2f // 定义一个返回顶点获取信息
{
float2 uv: TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v) // ( 这么用的是Unity 已经定义好的 顶点获取信息,无需在本类中再次定义)
v2f vert (appdata v) // 顶点着色器入口
{
v2f o;
o.vertex = mul(RNITY_MSTRIX_MVP,v.vertex);
o.uv = v.uv;
return o;
};
sampler2D _MainTex;
fixed4 frag (v2f l): SV_Target // 片段着色器入口
{
fixed4 col = tex2D(_MainTex, l.uv);
col = l - col;
return col;
};
ENDCG
}
学习完成的第一个shader:
Shader "GFSudy/Myshader"
{
//属性 可以在编辑器中查看和修改
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Pass{
CGPROGRAM // 插入Cg代码的开始
#pragma vertex my_vert // 把my_vert作为顶点Shader的入口
// 如何获取上一个模块的参数呢?: 语义绑定bind 输入输出
float4 my_vert(float4 pos:POSITION):POSITION
{
return UnityObjectToClipPos(pos);
}
#pragma fragment my_frag // 把my_frag作为片元Shader的入口
fixed4 my_frag():COLOR
{
return fixed4(1.0,0.0,0.0,1.0); //这里直接把颜色设置为了红色
}
ENDCG // 插入Cg代码的结束
}
}
FallBack "Diffuse"
}