顶点着色器和片元着色器染色+表面体着色器染色
顶点/片元着色器染色
创建材质球及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分量,是fixed3o.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中的Luminancefloat 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.实现相关功能
该系列专栏为网课课程笔记,仅用于学习参考。