光照
1、根据surface shader简化后的vs,ps版shader ----------------------- Bumped Specular
Shader "CM/Bumped Specular" {
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
_Shininess ("Shininess", Range (0.03, 1)) = 0.078125
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 400
Pass {
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
// compile directives
#pragma vertex vert_surf
#pragma fragment frag_surf
#pragma multi_compile_fwdbase
#include "HLSLSupport.cginc"
#include "UnityShaderVariables.cginc"
#define UNITY_PASS_FORWARDBASE
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _MainTex_ST;
float4 _BumpMap_ST;
fixed4 _Color;
half _Shininess;
struct v2f_surf
{
float4 pos : SV_POSITION;
float4 pack0 : TEXCOORD0;
fixed3 lightDir : TEXCOORD1;
//fixed3 vlight : TEXCOORD2;
float3 viewDir : TEXCOORD3;
//LIGHTING_COORDS(4,5)
};
v2f_surf vert_surf (appdata_full v)
{
v2f_surf o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.pack0.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);
float3 worldN = mul((float3x3)_Object2World, SCALED_NORMAL);
TANGENT_SPACE_ROTATION;
o.lightDir = mul (rotation, ObjSpaceLightDir(v.vertex));
o.viewDir = mul (rotation, ObjSpaceViewDir(v.vertex));
//o.vlight = ShadeSH9 (float4(worldN,1.0));
//TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}
fixed4 frag_surf (v2f_surf IN) : SV_Target
{
fixed4 tex = tex2D(_MainTex, IN.pack0.xy);
fixed3 Albedo = tex.rgb * _Color.rgb;
fixed Gloss = tex.a;
fixed Alpha = tex.a * _Color.a;
fixed Specular = _Shininess;
fixed3 Normal = UnpackNormal(tex2D(_BumpMap, IN.pack0.zw));
fixed4 c = 0;
half3 h = normalize (IN.lightDir + normalize(half3(IN.viewDir)));
fixed diff = max (0, dot (Normal, IN.lightDir));
float nh = max (0, dot (Normal, h));
float spec = pow (nh, Specular*128.0) * Gloss;
fixed atten = 1;//LIGHT_ATTENUATION(IN);
c.rgb = (Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);
c.a = Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
c.rgb += Albedo;// * IN.vlight;
return c;
}
ENDCG
}
}
}

2、根据surface shader简化后的vs,ps版shader ----------------------- Bumped Diffuse
Shader "CM/Bumped Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _BumpMap ("Normalmap", 2D) = "bump" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 300 Pass { Name "FORWARD" Tags { "LightMode" = "ForwardBase" } CGPROGRAM // compile directives #pragma vertex vert_surf #pragma fragment frag_surf #pragma multi_compile_fwdbase #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" sampler2D _MainTex; sampler2D _BumpMap; float4 _MainTex_ST; float4 _BumpMap_ST; fixed4 _Color; struct v2f_surf { float4 pos : SV_POSITION; float4 pack0 : TEXCOORD0; fixed3 lightDir : TEXCOORD1; //fixed3 vlight : TEXCOORD2; //LIGHTING_COORDS(3,4) }; // vertex shader v2f_surf vert_surf (appdata_full v) { v2f_surf o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex); o.pack0.zw = TRANSFORM_TEX(v.texcoord, _BumpMap); float3 worldN = mul((float3x3)_Object2World, SCALED_NORMAL); TANGENT_SPACE_ROTATION; o.lightDir = mul (rotation, ObjSpaceLightDir(v.vertex)); //o.vlight = ShadeSH9 (float4(worldN,1.0)); //TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } // fragment shader fixed4 frag_surf (v2f_surf IN) : SV_Target { fixed4 tex = tex2D(_MainTex, IN.pack0.xy) * _Color; fixed3 Albedo = tex.rgb; fixed Alpha = tex.a; fixed3 Normal = UnpackNormal(tex2D(_BumpMap, IN.pack0.zw)); fixed atten = 1;//LIGHT_ATTENUATION(IN); fixed4 c = 0; fixed diff = max (0, dot (Normal, IN.lightDir)); c.rgb = Albedo * _LightColor0.rgb * (diff * atten * 2); c.a = Alpha; c.rgb += Albedo;// * IN.vlight; return c; } ENDCG } } }

3、根据surface shader简化后的vs,ps版shader ----------------------- Diffuse
Shader "CM/Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 Pass { Name "FORWARD" Tags { "LightMode" = "ForwardBase" } CGPROGRAM // compile directives #pragma vertex vert_surf #pragma fragment frag_surf #pragma multi_compile_fwdbase #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Color; struct v2f_surf { float4 pos : SV_POSITION; float2 pack0 : TEXCOORD0; fixed3 normal : TEXCOORD1; //fixed3 vlight : TEXCOORD2; //LIGHTING_COORDS(3,4) }; // vertex shader v2f_surf vert_surf (appdata_full v) { v2f_surf o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex); o.normal = mul((float3x3)_Object2World, SCALED_NORMAL); //o.vlight = ShadeSH9 (float4(worldN,1.0)); //TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } // fragment shader fixed4 frag_surf (v2f_surf IN) : SV_Target { fixed4 tex = tex2D(_MainTex, IN.pack0.xyx) * _Color; fixed3 Albedo = tex.rgb; fixed Alpha = tex.a; fixed3 Normal = IN.normal; fixed4 c = 0; fixed atten = 1;//LIGHT_ATTENUATION(IN); fixed diff = max (0, dot (Normal, _WorldSpaceLightPos0.xyz)); c.rgb = Albedo * _LightColor0.rgb * (diff * atten * 2); c.a = Alpha; c.rgb += Albedo;// * IN.vlight; return c; } ENDCG } } Fallback "VertexLit" }
4 、最简单的cubmap
Shader "CM/Cubmap"
{
Properties
{
_Cubemap("CubeMap", CUBE) = ""{}
}
SubShader
{
Tags{ "Queue" = "Geometry" "IgnoreProjector" = "True" }
Pass
{
Tags{ "LightMode" = "ForwardBase" }
Fog{ Mode off }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
samplerCUBE _Cubemap;
struct appdata
{
float4 vertex : POSITION;
float4 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD1;
float3 worldPos : TEXCOORD2;
};
v2f vert(appdata v)
{
v2f o;
o.worldPos = mul(_Object2World, v.vertex);
o.worldNormal = mul((float3x3)_Object2World, v.normal);
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
float4 frag(v2f i) : COLOR
{
float3 worldNormal = normalize(i.worldNormal);
float3 worldViewDir = normalize(i.worldPos - _WorldSpaceCameraPos.xyz);
float3 worldReflect = reflect(worldViewDir, worldNormal);
return float4(texCUBE(_Cubemap, worldReflect).rgb, 1);
}
ENDCG
}
}
}
物理光照:
Shader "GeneratedFromSurface-NewSurfaceShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
// compile directives
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile_fwdbase
#include "UnityPBSLighting.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
half _Glossiness;
half _Metallic;
fixed4 _Color;
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
half3 worldNormal : TEXCOORD1;
float3 worldPos : TEXCOORD2;
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;
fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign;
o.worldPos = worldPos;
o.worldNormal = worldNormal;
return o;
}
fixed4 frag(v2f IN) : SV_Target
{
float3 worldPos = IN.worldPos;
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos));
fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
SurfaceOutputStandard o;
fixed4 c = tex2D(_MainTex, IN.uv.xy) * _Color;
o.Albedo = c.rgb;
o.Emission = 0.0;
o.Alpha = c.a;
o.Occlusion = 1.0;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Normal = IN.worldNormal;
// Setup lighting environment
UnityGI gi;
UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
gi.indirect.diffuse = 0;
gi.indirect.specular = 0;
gi.light.color = _LightColor0.rgb;
gi.light.dir = lightDir;
gi.light.ndotl = LambertTerm (o.Normal, gi.light.dir);
// Call GI (lightmaps/SH/reflections) lighting function
UnityGIInput giInput;
UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
giInput.light = gi.light;
giInput.worldPos = worldPos;
giInput.worldViewDir = worldViewDir;
giInput.atten = 1;
giInput.lightmapUV = 0.0;
giInput.ambient.rgb = 0.0;
giInput.probeHDR[0] = unity_SpecCube0_HDR;
giInput.probeHDR[1] = unity_SpecCube1_HDR;
giInput.boxMin[0] = unity_SpecCube0_BoxMin;
LightingStandard_GI(o, giInput, gi);
fixed4 finalCol = LightingStandard(o, worldViewDir, gi);
return finalCol;
}
ENDCG
}
}
FallBack "Diffuse"
}

浙公网安备 33010602011771号