和编写表面着色器不一样,在编写基于顶点和片元着色器当中,需要在SubShader中写上Pass通道,(至少要有一个Pass通道)
SubShader
{
pass
{
}
}
在ShaderLab中作为CG语言处理
在Pass通道中使用CGPROGRAM 和ENDCG 包裹住编写的CG代码片段
Shader "Leaning/CGPROGRAM/cg1"
{
SubShader
{
pass
{
CGPROGRAM
//编写的代码
ENDCG
}
}
}
💡 c语言的入口函数是main 顶点和片元程序也有入口函数
定义顶点和片元的入口函数
#pragma vertex vert//声明顶点处理函数 名为vert
#pragma fragment frag//声明片元处理函数 名为 frag
💡 在顶点片元着色器中,顶点函数和片元函数都必须编写 所以在CGPROGRAM中需要写上具体的函数
//顶点处理程序
void vert()
{
}
//片元处理程序
void frag()
{
}
但是光这样编写是不正确的
顶点程序会对顶点做一系列的处理,包括几何变换,变换过后要把需要的数据,传入几何片元,所以顶点程序必须要对数据进行处理,然后输出
片元程序拿到顶点传入的程序继续进行计算
语义
顶点程序必须要处理顶点,就需要传入顶点数据
//顶点处理程序
void vert(in float2 objPos:POSITION)
{
}
💡 所以在顶点处理程序中,填入变量in float2 objPos:POSITION
in是输入数据 float2是个浮点值,带有2阶向量的浮点值 POSITION则是语义,代表顶点坐标位置
在顶点程序中写上输出参数out float4 pos:POSITION
💡 顶点程序必须包含带有语义为POSITION的参数
void vert(in float2 objPos:POSITION,out float4 pos:POSITION)
{
}
在顶点处理程序中修改输出的Pos
pos=float4(objPos,0,1);
//顶点处理程序
void vert(in float2 objPos:POSITION,out float4 pos:POSITION)
{
pos=float4(objPos,0,1);
}
💡 利用float4将类型为float2的objPos与0和1组成一个4阶的向量
在片元处理程序,也要做类似的修改
片元处理程序,必须要至少包含一个语义为COLOR0或者是COLOR的参数 COLOR0和COLOR是等价的,所以二者选一个即可
void frag(out float4 col:COLOR)
{
}
为输出的COLOR附上红颜色的值
void frag(out float4 col:COLOR)
{
col=float4(1,0,0,1);
}
在顶点处理程序当中也可以对COLOR进行处理
💡 在顶点处理程序中添加out float4 col:COLOR 对COLOR进行处理 在片元处理程序当中,将out改为inout,表示COLOR直接输入和输出 在frag片元处理程序当中也可以,继续进行COLOR颜色的处理,片元程序的计算会在顶点程序计算之后, 所以如果下段代码注释去掉,最终使用的颜色会是float4(1,0,0,1)
Shader "Leaning/CGPROGRAM/cg1"
{
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//顶点处理程序
void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
{
pos=float4(objPos,0,1);
col=float4(0,0,1,1);
}
//片元处理程序
void frag(inout float4 col:COLOR)
{
// col=float4(1,0,0,1);
}
ENDCG
}
}
}
在计算机图形硬件当中需要对3D物体进行显示的时候,需要进行一系列的坐标系的转换
坐标系
💡 物体的坐标系是没有参考价值的,它只是在自己建模的坐标系当中 最终它要被放在世界当中,它与其他物体会有相对位置,同时它还被摄像机去拍摄 摆在不同的位置,摄像机取景的结果会不一样 💡 通过一系列的变换,会得到一个CVV的裁剪立方体
pos=float4(objPos,0,1); objPos在物体坐标系当中顶点x,y 最大可能是x=0.5,y=0.5 最小可能是x=-0.5,y=-0.5 当与后面的0和1组合过后,在CVV裁剪立方体后,得到的就是-0.5到+0.5 col=pos; 让顶点数据直接等于pos,应为数据类型都是float4,所以可以直接赋值 (x,y,z,w)对应的颜色分量即为(r,g,b,a),可以呈现如下图所示的效果


...