[1488] | 1 | //
|
---|
| 2 | // Hemisphere Lighting Model
|
---|
| 3 | // Copyright (c) Microsoft Corporation. All rights reserved.
|
---|
| 4 | //
|
---|
| 5 | // Note: This effect file works with EffectEdit.
|
---|
| 6 | //
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 | string XFile = "SkullOcc.x"; // model
|
---|
| 10 | int BCLR = 0xff202080; // background
|
---|
| 11 |
|
---|
| 12 | // light directions (view space)
|
---|
| 13 | float3 DirFromLight < string UIName = "Light Direction"; > = {0.577, -0.577, 0.577};
|
---|
| 14 |
|
---|
| 15 | // direction of light from sky (view space)
|
---|
| 16 | float3 DirFromSky < string UIName = "Direction from Sky"; > = { 0.0f, -1.0f, 0.0f };
|
---|
| 17 |
|
---|
| 18 | // light intensity
|
---|
| 19 | float4 I_a < string UIName = "Ambient Intensity";
|
---|
| 20 | string UIWidget = "Color";
|
---|
| 21 | float UIStep = 0.05;
|
---|
| 22 | string UIHelp = "The light intensity of the ambient lights";
|
---|
| 23 | > = { 0.5f, 0.5f, 0.5f, 1.0f }; // ambient
|
---|
| 24 | float4 I_b < string UIName = "Ground color";
|
---|
| 25 | string UIWidget = "Color";
|
---|
| 26 | float UIStep = 0.05;
|
---|
| 27 | string UIHelp = "The color of the ground";
|
---|
| 28 | > = { 0.1f, 0.0f, 0.0f, 1.0f }; // ground
|
---|
| 29 | float4 I_c < string UIName = "Sky Color";
|
---|
| 30 | string UIWidget = "Color";
|
---|
| 31 | float UIStep = 0.05;
|
---|
| 32 | string UIHelp = "The color of the sky";
|
---|
| 33 | > = { 0.9f, 0.9f, 1.0f, 1.0f }; // sky
|
---|
| 34 | float4 I_d < string UIName = "Diffuse Intensity";
|
---|
| 35 | string UIWidget = "Color";
|
---|
| 36 | float UIStep = 0.05;
|
---|
| 37 | string UIHelp = "The light intensity of the diffuse lights";
|
---|
| 38 | > = { 1.0f, 0.9f, 0.8f, 1.0f }; // diffuse
|
---|
| 39 | float4 I_s < string UIName = "Specular Intensity";
|
---|
| 40 | string UIWidget = "Color";
|
---|
| 41 | float UIStep = 0.05;
|
---|
| 42 | string UIHelp = "The light intensity of the specular lights";
|
---|
| 43 | > = { 1.0f, 1.0f, 1.0f, 1.0f }; // specular
|
---|
| 44 |
|
---|
| 45 | // material reflectivity
|
---|
| 46 | float4 k_a < string UIName = "Ambient Color";
|
---|
| 47 | string UIWidget = "Color";
|
---|
| 48 | float UIStep = 0.05;
|
---|
| 49 | string UIHelp = "Material Ambient Color";
|
---|
| 50 | > = { 0.8f, 0.8f, 0.8f, 1.0f }; // ambient
|
---|
| 51 | float4 k_d < string UIName = "Diffuse Color";
|
---|
| 52 | string UIWidget = "Color";
|
---|
| 53 | float UIStep = 0.05;
|
---|
| 54 | string UIHelp = "Material Diffuse Color";
|
---|
| 55 | > = { 0.4f, 0.4f, 0.4f, 1.0f }; // diffuse
|
---|
| 56 | float4 k_s < string UIName = "Specular Color";
|
---|
| 57 | string UIWidget = "Color";
|
---|
| 58 | float UIStep = 0.05;
|
---|
| 59 | string UIHelp = "Material Specular Color";
|
---|
| 60 | > = { 0.1f, 0.1f, 0.1f, 1.0f }; // specular
|
---|
| 61 | float n < string UIName = "Specular Power";
|
---|
| 62 | string UIWidget = "Numeric";
|
---|
| 63 | float UIStep = 1;
|
---|
| 64 | string UIHelp = "Specular Power";
|
---|
| 65 | > = 32.0f; // power
|
---|
| 66 |
|
---|
| 67 |
|
---|
| 68 | // transformations
|
---|
| 69 | float4x4 WorldView : WORLDVIEW;
|
---|
| 70 | float4x4 Projection : PROJECTION;
|
---|
| 71 |
|
---|
| 72 | struct VS_OUTPUT
|
---|
| 73 | {
|
---|
| 74 | float4 Pos : POSITION;
|
---|
| 75 | float4 Diff : COLOR0;
|
---|
| 76 | float4 Spec : COLOR1;
|
---|
| 77 | };
|
---|
| 78 |
|
---|
| 79 | VS_OUTPUT VS(
|
---|
| 80 | float3 Pos : POSITION,
|
---|
| 81 | float3 Norm : NORMAL,
|
---|
| 82 | float Occ : TEXCOORD0,
|
---|
| 83 | uniform bool bHemi,
|
---|
| 84 | uniform bool bDiff,
|
---|
| 85 | uniform bool bSpec)
|
---|
| 86 | {
|
---|
| 87 | VS_OUTPUT Out = (VS_OUTPUT)0;
|
---|
| 88 |
|
---|
| 89 | float3 L = -DirFromLight; // diffuse direction
|
---|
| 90 | float3 Y = -DirFromSky; // hemisphere up axis
|
---|
| 91 | float3 P = mul(float4(Pos, 1), (float4x3)WorldView); // position (view space)
|
---|
| 92 | float3 N = normalize(mul(Norm, (float3x3)WorldView)); // normal (view space)
|
---|
| 93 | float3 R = normalize(2 * dot(N, L) * N - L); // reflection vector (view space)
|
---|
| 94 | float3 V = -normalize(P); // view direction (view space)
|
---|
| 95 |
|
---|
| 96 | float4 Amb = k_a * I_a;
|
---|
| 97 | float4 Hemi = k_a * lerp(I_b, I_c, (dot(N, Y) + 1) / 2) * (1 - Occ);
|
---|
| 98 | float temp = 1 - max(0, dot(N, L));
|
---|
| 99 | float4 Diff = k_d * I_d * (1 - temp * temp);
|
---|
| 100 | float4 Spec = k_s * I_s * pow(max(0, dot(R, V)), n/4);
|
---|
| 101 | float4 Zero = 0;
|
---|
| 102 |
|
---|
| 103 | Out.Pos = mul(float4(P, 1), Projection); // position (projected)
|
---|
| 104 | Out.Diff = (bDiff ? Diff : 0)
|
---|
| 105 | + (bHemi ? Hemi : Amb); // diffuse + ambient/hemisphere
|
---|
| 106 | Out.Spec = (bSpec ? Spec : 0); // specular
|
---|
| 107 |
|
---|
| 108 | return Out;
|
---|
| 109 | }
|
---|
| 110 |
|
---|
| 111 | technique THemisphereDiffuseSpecular
|
---|
| 112 | {
|
---|
| 113 | pass P0
|
---|
| 114 | {
|
---|
| 115 | VertexShader = compile vs_1_1 VS(true, true, true);
|
---|
| 116 |
|
---|
| 117 | SpecularEnable = TRUE;
|
---|
| 118 | }
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | technique THemisphereDiffuse
|
---|
| 122 | {
|
---|
| 123 | pass P0
|
---|
| 124 | {
|
---|
| 125 | VertexShader = compile vs_1_1 VS(true, true, false);
|
---|
| 126 | }
|
---|
| 127 | }
|
---|
| 128 |
|
---|
| 129 |
|
---|
| 130 | technique THemisphere
|
---|
| 131 | {
|
---|
| 132 | pass P0
|
---|
| 133 | {
|
---|
| 134 | VertexShader = compile vs_1_1 VS(true, false, false);
|
---|
| 135 | }
|
---|
| 136 | }
|
---|
| 137 |
|
---|
| 138 |
|
---|
| 139 | technique TAmbient
|
---|
| 140 | {
|
---|
| 141 | pass P0
|
---|
| 142 | {
|
---|
| 143 | VertexShader = compile vs_1_1 VS(false, false, false);
|
---|
| 144 | }
|
---|
| 145 | }
|
---|
| 146 |
|
---|
| 147 | technique TAmbientDiffuse
|
---|
| 148 | {
|
---|
| 149 | pass P0
|
---|
| 150 | {
|
---|
| 151 | VertexShader = compile vs_1_1 VS(false, true, false);
|
---|
| 152 | }
|
---|
| 153 | }
|
---|
| 154 |
|
---|
| 155 | technique TAmbientDiffuseSpecular
|
---|
| 156 | {
|
---|
| 157 | pass P0
|
---|
| 158 | {
|
---|
| 159 | VertexShader = compile vs_1_1 VS(false, true, true);
|
---|
| 160 |
|
---|
| 161 | SpecularEnable = TRUE;
|
---|
| 162 | }
|
---|
| 163 | }
|
---|
| 164 |
|
---|