顶点/片元着色器染色
创建材质球及Shader同名文件VFColor
//Update NOTE:replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "CreateTest/VFColor"
{
Properties
{
_Color("颜色",Color)=(1,1,1,1)
}
SubShader
{
Pass
{
//顶点片元着色器要写在Pass通道内
CGPROGRAM //Cg语言开始的定界符
#pragma vertex vert //通过Cg命令,设定vert()函数为顶点着色器调用的回调函数
#pragma fragment frag //通过Cg命令,设定frag()函数为片元着色器调用的回调函数
//如果在Cg语言中,需要材质球的属性值,则需要导入变量
fixed4 _Color;
//变量名称,需要与材质中属性的名称,保持一致
//GPU在几何阶段运行的回调函数(顶点着色器)
//要做什么?将模型空间下的点,转换到裁剪空间下
//要传入什么?CPU传递过来的模型空间下的点的位置,传出是什么?点在裁剪空间下点的位置
//POSITION语义,告诉GPU,你将模型空间下的点的位置,赋值到v变量中
//SV_POSITION语义,告诉GPU,我将计算后的裁剪空间下的点的位置,放在了函数返回值中
float4 vert(float4 v:POSITION): SV_POSITION
{
//矩阵运算做坐标转换
//Unity的内置矩阵UNITY_MATRIX_MVP,可以将点从模型空间,转换到裁剪空间下
//返回就会把数据传回GPU,继续执行渲染流水线
return UnityObjectToClipPos(v);
}
//GPU在光栅化阶段运行的回调函数(片元着色器)
//要做什么?给物体上的所有顶点进行染色
//传入是什么?顶点着色器经过计算后,点在裁剪空间下的位置。
//传出是什么?需要渲染的点的颜色
//SV_POSITION语义:告诉GPU,你将顶点着色器算出来的裁剪空间下的点的位置
//赋值在v变量中
//SV_Target语义:告诉GPU,我当前要显示的点的颜色值是多少,你显示出来
fixed4 frag(float4 v:SV_POSITION): SV_Target
{
return _Color;
}
ENDCG //Cg语言结束的定界符
}
}
Fallback "Diffuse"
}
表面体着色器染色
创建材质球及Shader同名文件SurfaceColor(Shader文件选择Standard Surface Shader)
编写相关代码如下所示:
Shader "CreateTest/SurfaceColor"
{
Properties
{
_Color("颜色",Color)=(1,1,1,1)
}
SubShader
{
CGPROGRAM
//设定表面体着色器的回调函数为surf(),并且使用标准光照
#pragma surface surf Standard
//设定表面体着色器最低的DirectX版本为9.0
#pragma target 3.0
//表面体着色器传递过来的纹理的UV坐标数据
struct Input{
float2 uv_MainTex;
};
fixed4 _Color;
//表面体着色器(基于VF封装)
//参数1:从CPU获得的数据
//参数2:SurfaceOutputStandard是表面体着色器定义的标准Shader的返回值结构
//如果要实现效果,只需要找到对应的属性,进行赋值即可
void surf(Input IN,inout SurfaceOutputStandard o)
{
//Albedo是SurfaceOutputStandard定义的修改颜色的属性
//_Color.rgb是取属性中配置的颜色的rgb分量,是fixed3
o.Albedo=_Color.rgb;
//Alpha是SurfaceOutputStandard定义的修改透明度的属性
o.Alpha=_Color.a;
}
ENDCG
}
Fallback "Diffuse"
}
实现去色相关Shader
相关代码如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "CreateTest/Gray" {
Properties
{
_MainTex("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
struct vertexOutput {
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
};
vertexOutput vert(appdata_full input)
{
vertexOutput output;
output.pos = UnityObjectToClipPos(input.vertex);
output.tex = input.texcoord;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
float4 col = tex2D(_MainTex, input.tex);
//参考UnityCG.cginc中的Luminance
float grey = dot(col.rgb, fixed3(0.22, 0.707, 0.071));
col.rgb = float3(grey, grey, grey);
return col;
}
ENDCG}
}
//如果以上SubShader渲染失败则回滚采用Diffuse
FallBack "Diffuse"
}
猜测修改Unity的内置图片Shader,将颜色rgb运算后,会得到这个结果。
去色效果如图:
快速编写相关Shader的代码思路
1.官网内置Shader包(www.unity3d.com最下方,旧版本下载)
2.根据组件使用的Shader到内置包中找Shader源文件
根据Shader内部名称,定位到Shader文件
3.导入项目,修改Shader名称
4.能够被Image显示
建立材质球
将材质球与Shader关联
将材质球,挂载Image组件上
5.实现相关功能
该系列专栏为网课课程笔记,仅用于学习参考。