学习目标:
shader语义 vert frag函数
学习时间:
2022.5.27
学习产出:
1.实现效果
2.代码分析
Shader "Unlit/002"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
//定义了顶点着色器和片元着色器的函数名 在下面调用的时候 名字必须相同 否则会编译出错
#pragma vertex vert //顶点vert
#pragma fragment frag //片元frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
//POSITION SV_POSITION 语义 不可省略 这些语义将会告诉系统,用户需要哪些输入值,以及用户的输出是什么 定义类型
//POSITION 输入 v是我们输入的模型顶点信息
//在这里POSITION将告诉Unity,把模型的顶点坐标填充到输入参数v中
//SV_POSITION 输出 是顶点输出之后 我们裁剪空间里面的顶点坐标
//在这里SV_POSITION将告诉Unity,顶点着色器的输出是裁剪空间中的顶点坐标
//简单地说POSITION语意用于顶点着色器,用来指定这些个位置坐标值,是在变换前的顶点的object space坐标(模型坐标)。
//SV_POSITION语意则用于像素着色器,用来标识经过顶点着色器变换之后的顶点坐标。
float4 vert(float4 v:POSITION) :SV_POSITION
{
//将模型空间下的顶点转换到齐次裁剪空间
return UnityObjectToClipPos(v);
}
//frag函数没有任何输入 他的输出是一个fixed4类型的变量
//使用SV_TARGET语义进行限定
//它等同于告诉渲染器,把用户的输出颜色存储到一个渲染目标 这里将输出到默认的帧缓存中
//这里返回了一个表示白色的fixed4类型的变量
fixed4 frag() : SV_TARGET
{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
2.1 函数定义
我们必须在一个SubShader里面定义好我们的vertex和fragment的函数名
在这里定义好了之后,后面就会将这个函数名作为这个函数进行执行
定义了顶点着色器和片元着色器的函数名
在下面调用的时候 名字必须相同 否则会编译出错
//定义了顶点着色器和片元着色器的函数名 在下面调用的时候 名字必须相同 否则会编译出错
#pragma vertex vert //顶点vert
#pragma fragment frag //片元frag
3. 顶点着色器
渲染流水线就定义了顶点着色器的作用
顶点着色器一般用来处理图形每个顶点的变换,例如 平移、缩放、旋转、投影等,最终输出
顶点的最终裁剪空间位置
POSITION SV_POSITION
语义 不可省略 这些语义将会告诉系统,用户需要哪些输入值,以及用户的输出是什么 定义类型
POSITION
输入
v
是我们输入的模型顶点信息
在这里POSITION将告诉Unity,把模型的顶点坐标
填充到输入参数v
中
现在v就存放着POSITION信息,作为参数传入了
SV_POSITION
输出 是顶点输出之后 我们
裁剪空间里面的顶点坐标
在这里SV_POSITION将告诉Unity,顶点着色器的输出是裁剪空间中的顶点坐标
简单地说POSITION语意用于顶点着色器,用来指定这些个位置坐标值,是在变换前的顶点的object space坐标(模型坐标)。
SV_POSITION语意则用于像素着色器,用来标识经过顶点着色器变换之后的顶点坐标。
float4 vert(float4 v:POSITION) :SV_POSITION
{
//将模型空间下的顶点转换到齐次裁剪空间
return UnityObjectToClipPos(v);
}
4. 片元着色器
片元着色器的作用是处理由光栅化阶段生成的每个片元,最终计算出每个像素的最终颜色。归根结底,实际上就是数据的集合。这个数据集合包含每一个像素的各个颜色分量和像素透明度的值。
这里frag函数没有任何输入 他的输出是一个fixed4类型的变量
使用SV_TARGET语义进行限定
它等同于告诉渲染器,把用户的输出颜色存储到一个渲染目标 这里将输出到默认的帧缓存中
这里返回了一个表示白色的fixed4类型的变量
fixed4 frag() : SV_TARGET
{
return fixed4(1,1,1,1);
}