美文网首页unity3D技术分享Unity3DUnity Shader分享
Unity Shader 漫反射二 基于片元着色器(逐像素)

Unity Shader 漫反射二 基于片元着色器(逐像素)

作者: 土豆写书 | 来源:发表于2018-11-15 16:47 被阅读0次
    // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
    // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
    Shader "My/Shader_diffuse_fragment"
    {
        Properties
        {
            _Diffuse("漫反射",color) = (1.0,1.0,1.0,1.0)
        }
    
    
            SubShader
        {
    
    
            Pass
        {
            Tags{ "LightMode" = "ForwardBase" }
    
            CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    
    #include "Lighting.cginc"
    
            fixed4 _Diffuse;  //颜色属性范围是0~1 所以可以使用 fixed 来存放
    
        struct a2v {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
        };
    
    
    
        struct v2f {
            float4 pos: SV_POSITION;
            fixed3 worldNormal : TEXCOORD0;
        };
    
        v2f vert(a2v v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//顶点的世界坐标系法线
    
            return o;
        }
    
        fixed4 frag(v2f i) : SV_Target
        {
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
            fixed3 worldNormal = normalize(i.worldNormal);
            fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
    
            fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));
            fixed3 color = ambient + diffuse;
    
            return fixed4(color, 1.0);
        }
    
            ENDCG
        }
        }
    
            Fallback "Diffuse"
    }
    
    
    • 解读
         顶点着色器计算好世界坐标及其法线,传递给片元着色器计算光照,这样比顶点着色器更平滑。
      其他详解,请跳转上一篇

    相关文章

      网友评论

        本文标题:Unity Shader 漫反射二 基于片元着色器(逐像素)

        本文链接:https://www.haomeiwen.com/subject/itwyfqtx.html