Shader学习笔记三之顶点片元着色器的基本结构

#pragma vertex ver//创建顶点着色器
#pragma fragment fra//创建一个片元着色器

先创建一个顶点着色器的代码,将模型顶点坐标输入,并将顶点坐标从模型空间转换到裁剪空间

float4 vert(float4 pos:POSITION):SV_POSITION
{
    return UnityObjectToClipPos(pos);
}

POSITION为语义告诉unity将模型的顶点坐标输入到参数pos中
SV_POSITION也是语义告诉unity顶点着色器输出是裁剪空间的顶点坐标
UnityObjectToClipPos是将顶点从模型坐标转换到裁剪空间
再创建一个片元着色器,将用户的输出颜色储存到一个渲染目标

fixed4 frag():SV_Target
{
	return fixed4(1,1,1,1);
 }

这里frag函数没有输入,SV_Target是一个语义告诉渲染器把用户输出的颜色存储到一个渲染目标里

最终显示图

在这里插入图片描述

使用结构体控制顶点着色器的输入
struct a2v 
 {
    float4 pos:POSITION;
    float4 nor:NORMAL;
    float4 tex:TEXCOORD0;
};

声明一个结构体来定义顶点着色器的输入
POSITION语义告诉unity,用模型顶点坐标填充pos变量
NORMAL语义告诉unity,用模型法线方向填充nor变量
TEXCOORD0语义告诉unity,用模型第一套纹理坐标填充tex变量

使用结构体控制顶点着色器的输出
struct v2f 
{
	float4 svpos:SV_POSITION;
	float4 color:COLOR0;
};

声明一个结构体来定义顶点着色器的输出
顶点着色器输出结构必须包含一个变量,他的语义为SV_POSITION否则渲染器无法得到裁剪空间的顶点坐标,就无法将顶点渲染到屏幕上
COLOR0语义可以自由定义,一般用来存储颜色

v2f vert(a2v v)
{
	v2f o;
	o.svpos = UnityObjectToClipPos(v.pos);
	o.color = v.nor * 0.5+fixed4(0.5, 0.5, 0.5, 1);
	return o;
}
fixed4 frag(v2f i):SV_Target
{
	return fixed4(i.color);
}

声明输入结构在这里定义为v
将输出结构定义为o
把顶点坐标输出到裁剪空间
v.nor包含顶点的法线方向,分量在[-1,1],代码把分量范围映射到[0,1],然后储蓄o.color里传入片元着色器

然后在片元着色器里输入刚刚传入的值
将i.color显示在屏幕上

发布了7 篇原创文章 · 获赞 0 · 访问量 179

猜你喜欢

转载自blog.csdn.net/f_TaoYuHu/article/details/104636075
今日推荐