基本光照模型实现-高光反射

来源:互联网 发布:uva 编程 编辑:程序博客网 时间:2024/04/30 14:09

高光反射计算公式

Phong模型

cspecular=(clightmspecular)max(0,v^r^)mgloss

r^=l^2(n^l^)n^

Blinn-Phong模型

cspecular=(clightmspecular)max(0,n^h^)mgloss

h^=v^+l^|v^+l^|

源码-逐顶点

Shader "Custom/SpecularVertexLevel" {    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 color : COLOR;            };            v2f vert(a2v v){                v2f o;                o.pos = UnityObjectToClipPos(v.vertex);                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;                fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));                fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);                o.color = ambient + diffuse + specular;                return o;            }            fixed4 frag(v2f i): SV_Target{                return fixed4(i.color, 1.0);            }            ENDCG        }    }    FallBack "Speculr"}

源码-逐像素

Shader "Custom/SpecularPixelLevel" {    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;                o.pos = UnityObjectToClipPos(v.vertex);                o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);                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 * saturate(dot(worldNormal, worldLightDir));                fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);                return fixed4(ambient + diffuse + specular, 1.0);            }            ENDCG        }    }    FallBack "Speculr"}

Blin-Phong逐像素

Shader "Custom/BlinnPhong" {    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;                o.pos = UnityObjectToClipPos(v.vertex);                o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);                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 * saturate(dot(worldNormal, worldLightDir));                //fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                fixed3 halfDir = normalize(worldLightDir + viewDir);                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);                return fixed4(ambient + diffuse + specular, 1.0);            }            ENDCG        }    }    FallBack "Speculr"}

效果图

这里写图片描述

阅读全文
0 0