代码结构
先贴一下代码,看一眼大概的结构,之后再慢慢解释
Shader "Custom/NewSurfaceShader"
{
Properties{
}
SubShader
{
pass {
CGPROGRAM
//定义一个顶点处理函数
#pragma vertex vert
//定义一个片段处理函数
#pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION {
return UnityObjectToClipPos(v);
}
float4 frag(float4 c : COLOR) : SV_Target {
return c;
}
ENDCG
}
}
FallBack "Diffuse"
}
语义
被老外定义好的,不要像我一样纠结为什么POSITION可以输入给一个值,SV_POSITION会返回给系统…
从应用程序传递给顶点函数的语义:
POSITION 顶点坐标
NORMAL 法线
TANGENT 切线
TEXCOORD0~n 纹理坐标
COLOR 顶点颜色
从顶点函数传递给片元函数的语义:
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个
COLOR1 可以传递一组值 4个
TEXCOORD0~7 传递纹理坐标
从片元函数传递给系统的语义:
SV_Target 颜色值,输出到屏幕上的颜色
解释
一个pass就是对物体进行一次渲染,pass可以写多个,会按照顺序依次渲染
pass{
}
和上一篇里定义光照的方式相似,这里是定义顶点函数与片段函数
//定义一个顶点处理函数
#pragma vertex vert
//定义一个片段处理函数
#pragma fragment frag
这两个函数是这个shader的核心部分,它究竟执行了什么呢?
它大概什么都没执行…
float4 v : POSITION 我们定义了一个float4类型的变量 v,值来自POSITION,上面解释过了,POSITION是模型的坐标
float4 vert : SV_POSITION 定义了返回值会赋值给SV_POSITION
UnityObjectToClipPos(v);我们传进来的坐标是模型空间的,这个函数的作用是把这个坐标转换成相机中的2d坐标,也就是屏幕中显示的坐标.实现的原理是矩阵变换,矩阵是向量的函数,一个向量乘矩阵可以得到一个向量,所有的点与0点的向量乘矩阵,也就是坐标变换了.具体怎么算变换矩阵,我已经还给老师了- -有需求的时候再去复习线性代数就好了
float4 c : COLOR 定义了float4类型数据c,值取自顶点颜色COLOR
float4 frag : SV_Target 输出值frag传给了SV_Target
至此本次渲染就结束了,他的作用就是把物体投影到屏幕上,然后赋值了一个顶点的颜色,比默认的shader还敷衍2333
默认的shader还带了个白色
float4 vert(float4 v : POSITION) : SV_POSITION{
return UnityObjectToClipPos(v);
}
float4 frag(float4 c : COLOR) : SV_Target{
return c;
}
效果
5毛都没有的效果