Unity最简单的顶点片元着色器

发表于2018-07-05
评论0 4.2k浏览
一、创建shader

1.选择文件夹右键点击,按如图顺序创建shader
2.再创建材质(Material),将shader拖给材质
3.创建球体,材质拖给球体

二、编辑Shader
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5-SimpleShader"
{
    Properties {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            //CGPROGRAM,ENDCG包围的为需要编辑的CG代码片段
            #pragma vertex vert
            #pragma fragment frag
            //这2行告诉Unity,哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码;
            //编译指令:#pragma vertex name
            //name为指定的函数名,一般用vert,frag
            //v包含了这个顶点的位置,这是通过POSITION语义指定;
            //它的返回值是一个float4类型的变量,它是该顶点在裁剪空间的位置;POSITION,SV_POSITION都是Cg/HLSL中的语义,不可省略,用以限定输入输出参数;如POSITION告诉Unity,把模型的顶点坐标填充到v中,SV_POSITION告诉Unity,输出是裁剪空间的顶点坐标
            float4 vert(float4 v: POSITION ): SV_POSITION{
                return UnityObjectToClipPos (v);
                //mul(UNITY_MATRIX_MVP,v);上一行本是这个,把顶点坐标从模型空间转换到裁剪空间;被Unity更换成了return UnityObjectToClipPos (v)           
            }
            //frag函数没有任何输入;
            //SV_Target告诉渲染器,把用户的输出颜色存储到一个渲染目标中
            fixed4 frag(): SV_Target{
                return fixed4(1.0,1.0,1.0,1.0);//白色
            }
            ENDCG
        }
    }
}

三、定义模型数据

修改代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5-SimpleShader"
{
    Properties {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            //增加了一个结构体,a表示应用(Application),v表示顶点着色器(vertex shader),a2v意思是把数据从应用阶段传递到顶点着色器,这样我们可以在顶点着色器中访问模型数据
            struct a2v
            {
                float4 vertex: POSITION;
                //修改了vert函数的参数类型
                //POSITION等来自Mesh Render组件
                float3 normal: NORMAL;//法线方向
                float4 texcoord :TEXCOORD0 ;//第一套纹理坐标
            };
            float4 vert(a2v v): SV_POSITION{//更改
                return UnityObjectToClipPos (v);            
            }
            fixed4 frag(): SV_Target{
                return fixed4(1.0,1.0,1.0,1.0);
            }
            ENDCG
        }
    }
}

四、顶点着色器和片元着色器间进行通信
Shader "Unlit/Chapter5-SimpleShader"
{
    SubShader
    {
        Properties {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
    }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            struct a2v
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0 ;
            };
            struct v2f
            {
                float4 pos : SV_POSITION;
                float3 color : COLOR0;
            };
            float4 vert(a2v v): v2f{
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.color=v.normal*0.5+fixed3(0.5,0.5,0.5); 
                //v.normal包含法线方向,分量范围在[-1.0,1.0]
                //存储到o.color传递给片元着色器
                return o;           
            }
            fixed4 frag(v2f i): SV_Target{
                //将插值后的i.color显示到屏幕上
                return fixed4(i.color,1.0);
            }
            ENDCG
        }
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引