Unity Shader 内置的函数 和 基本光照模型实现

Unity Shader 内置的函数

UnityCG.cginc中常用的一些帮助函数

函数名 描述
float3 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间从该点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) 输入一个世界空间中的定点位置,其余同上,上个函数调用了此函数
float3 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间到摄像机的观察方向
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向从模型控件转换到世界空间
float3 UnityObjectToWorldDir(float3 dir) 把方向矢量从模型控件转换到世界空间
float3 UnityWorldToObjectDir(float3 dir) 把方向矢量从世界空间转换到模型空间

Unity Shader 实现漫反射+高光反射+半兰伯特光照效果实现

逐像素,主要实现位于片元着色器

Shader "Unity Shaders Learning/DiffuseAndSpecular Pixel-Level" {
    Properties{
        _Diffuse("Diffuse", Color) = (1,1,1,1)
        _Specular("Specular", Color) = (1,1,1,1)
        _Gloss("Gloss",Range(8.0, 256)) = 20
    }

    SubShader{
        Pass{
            Tags{ "LightMode" = "ForwardBase" }

            CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"

        fixed4 _Diffuse;
        fixed4 _Specular;
        float _Gloss;

        struct a2v {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float3 worldNormal : TEXCOORD0;
            float3 worldPos:TEXCOORD1;
        };

        v2f vert(a2v v) {
            v2f o;
            // Transform position
            o.pos = UnityObjectToClipPos(v.vertex);
            // Normal
            o.worldNormal = UnityObjectToWorldNormal(v.normal);
            // worldPos
            o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
            return o;
        }

        fixed4 frag(v2f i) :SV_Target{

            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

            fixed3 worldNormal = normalize(i.worldNormal);
            fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
            // 半兰伯特模型
            fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (dot(worldNormal, worldLightDir)*0.5 + 0.5);

            fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));

            fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

            fixed3 specular = _LightColor0.rgb*_Specular.rbg*pow(saturate(dot(reflectDir, viewDir)), _Gloss);

            return fixed4(ambient+diffuse+specular, 1.0);
        }

            ENDCG
        }
    }

    FallBack "Diffuse"
}

逐像素点 高光-漫反射光照模型

猜你喜欢

转载自blog.csdn.net/qq_32418469/article/details/81282629