顶点着色器和片元着色器染色+表面体着色器染色

发布于:2025-05-01 ⋅ 阅读:(12) ⋅ 点赞:(0)
顶点/片元着色器染色

创建材质球及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.实现相关功能

 该系列专栏为网课课程笔记,仅用于学习参考。


网站公告

今日签到

点亮在社区的每一天
去签到