目录
[1 上集回顾](#1 上集回顾)
[2 本节介绍](#2 本节介绍)
[1 获取位置信息](#1 获取位置信息)
[2 处理颜色](#2 处理颜色)
一、本节介绍
1 上集回顾
上一集我们学到,shader的语法格式
2 本节介绍
这一集学习,第二简单的shader案例,对shader颜色的简单干预。
二、理论介绍
1 获取位置信息
Unity | Shader基础知识(什么是shader)_unity shader-CSDN博客
在这一文章中,我们可以看出,最初决定位置的叫顶点着色器,因为确定位置后才可以上色。
结论:我们可以在顶点着色器中干预上色的位置
2 改变颜色思路
上色的最后一步是在片元着色器(也叫像素着色器),我们可以不管它中间怎么运行的,我们在最后给他改颜色,显示出来的肯定会改。
三、对材质颜色进行干预的案例
本案例用到的语义:
:POSITION 获取到模型的顶点坐标
:SV_POSITION 输出给像素着色器的屏幕坐标
:SV_TARGET 输出值直接用于渲染了
1 获取位置信息
a.上文说过,我们需要在顶点着色器中获取模型的顶点位置信息
引入顶点位置信息代码:
cs
Shader "Custom/001"
{
SubShader
{
pass
{
CGPROGRAM
//引入vertex //起名叫vert
#pragma vertex vert
ENDCG
}
}
}
b.获取模型顶点位置
根据上文语义讲解部分,我们已经知道如何拿到模型顶点。
c.坐标转换
模型的顶点位置肯定是世界坐标下的,我们屏幕不一定能显示全面,我们的shader只需要管屏幕看得到的东西就够了,所以我们需要知道屏幕坐标下的位置信息。
结论:我们需要把世界坐标下的顶点位置,转换成屏幕坐标下的位置
方法:unity已经给我弄好了,直接用就可以
世界坐标转屏幕坐标代码如下:
cs
//最后会得到,模型的屏幕坐标
UnityObjectToClipPos(这里输入模型的顶点世界坐标)
d.把转换好的坐标输出给像素着色器的屏幕坐标
上述功能代码汇总:
cs
Shader "Custom/001"
{
SubShader
{
pass
{
CGPROGRAM
//引入vertex //起名叫vert
#pragma vertex vert
//引入模型顶点坐标 //return的值直接给到片元着色器的屏幕坐标
float4 vert(float4 v :POSITION):SV_POSITION
{
//返回处理过的坐标数据
return UnityObjectToClipPos(v);
}
ENDCG
}
}
}
2 处理颜色
a.引入片元着色器信息代码
cs
//引入fragment //起名叫frag
#pragma fragment frag
b.修改颜色代码
因为片元着色器输出的直接是颜色了,我们假设想输出一个白色
cs
//白色的写法(原因略)
fixed4(1,1,1,1)
片元着色器输出白色代码
cs
//片元着色器方法 //直接输出渲染
float4 frag():SV_TARGET
{
//输出白色
return float4(1,1,1,1);
}
备注:
这里return 的数据,如果是都在0-1里面,默认0是黑色,1是白色。
如果是在0-255里,默认0是黑色,255是白色。
四、本节全部代码
cs
Shader "Custom/001"
{
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v :POSITION):SV_POSITION
{
return UnityObjectToClipPos(v);
}
float4 frag():SV_TARGET
{
return float4(1,1,1,1);
}
ENDCG
}
}
}
五、下集预告
下集会讲解shader语法,用结构体获取数据