d3d/archive/D3D11_3_FunctionalSpec.htm [8868:9002]: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface Light { float3 Calculate(float3 Position, float3 Normal); }; class AmbientLight : Light { float3 m_AmbientValue; float3 Calculate(float3 Position, float3 Normal) { return m_AmbientValue; } }; class DirectionalLight : Light { float3 m_LightDir; float3 m_LightColor; float3 Calculate(float3 Position, float3 Normal) { float LightContrib = saturate( dot( Normal, -m_LightDir) ); return m_LightColor * LightContrib; } }; uint g_NumLights; uint g_LightsInUse[4]; Light g_Lights[9]; float3 AccumulateLighting(float3 Position, float3 Normal) { float3 Color = 0; for (uint i = 0; i < g_NumLights; i++) { Color += g_Lights[g_LightsInUse[i]].Calculate(Position, Normal); } return Color; } interface Material { void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord); float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord); }; class FlatMaterial : Material { float3 m_Color; void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { return m_Color * AccumulateLighting(Position, Normal); } }; class TexturedMaterial : Material { float3 m_Color; Texture2D<float3> m_Tex; sampler m_Sampler; void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { float3 Color = m_Color; Color *= m_Tex.Sample(m_Sampler, TexCoord) * 0.1234; Color *= AccumulateLighting(Position, Normal); return Color; } }; class StrangeMaterial : Material { void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { Position += Normal * 0.1; } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { return AccumulateLighting(Position, Normal); } }; float TestValueFromLight(Light Obj, float3 Position, float3 Normal) { float3 Calc = Obj.Calculate(Position, Normal); return saturate(Calc.x + Calc.y + Calc.z); } AmbientLight g_Ambient0; DirectionalLight g_DirLight0; DirectionalLight g_DirLight1; DirectionalLight g_DirLight2; DirectionalLight g_DirLight3; DirectionalLight g_DirLight4; DirectionalLight g_DirLight5; DirectionalLight g_DirLight6; DirectionalLight g_DirLight7; FlatMaterial g_FlatMat0; TexturedMaterial g_TexMat0; StrangeMaterial g_StrangeMat0; float4 main ( Material MyMaterial, float3 CurPos: CurPosition, float3 Normal : Normal, float2 TexCoord : TexCoord0) : SV_Target { float4 Ret; if (TestValueFromLight(g_DirLight0, CurPos, Normal) > 0.5) { MyMaterial.Perturb(CurPos, Normal, TexCoord); } Ret.xyz = MyMaterial.CalculateLitColor(CurPos, Normal, TexCoord); Ret.w = 1; return Ret; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d3d/archive/images/d3d11/D3D11_3_FunctionalSpec.htm [7981:8115]: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -interface Light { float3 Calculate(float3 Position, float3 Normal); }; class AmbientLight : Light { float3 m_AmbientValue; float3 Calculate(float3 Position, float3 Normal) { return m_AmbientValue; } }; class DirectionalLight : Light { float3 m_LightDir; float3 m_LightColor; float3 Calculate(float3 Position, float3 Normal) { float LightContrib = saturate( dot( Normal, -m_LightDir) ); return m_LightColor * LightContrib; } }; uint g_NumLights; uint g_LightsInUse[4]; Light g_Lights[9]; float3 AccumulateLighting(float3 Position, float3 Normal) { float3 Color = 0; for (uint i = 0; i < g_NumLights; i++) { Color += g_Lights[g_LightsInUse[i]].Calculate(Position, Normal); } return Color; } interface Material { void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord); float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord); }; class FlatMaterial : Material { float3 m_Color; void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { return m_Color * AccumulateLighting(Position, Normal); } }; class TexturedMaterial : Material { float3 m_Color; Texture2D<float3> m_Tex; sampler m_Sampler; void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { float3 Color = m_Color; Color *= m_Tex.Sample(m_Sampler, TexCoord) * 0.1234; Color *= AccumulateLighting(Position, Normal); return Color; } }; class StrangeMaterial : Material { void Perturb(in out float3 Position, in out float3 Normal, in out float2 TexCoord) { Position += Normal * 0.1; } float3 CalculateLitColor(float3 Position, float3 Normal, float2 TexCoord) { return AccumulateLighting(Position, Normal); } }; float TestValueFromLight(Light Obj, float3 Position, float3 Normal) { float3 Calc = Obj.Calculate(Position, Normal); return saturate(Calc.x + Calc.y + Calc.z); } AmbientLight g_Ambient0; DirectionalLight g_DirLight0; DirectionalLight g_DirLight1; DirectionalLight g_DirLight2; DirectionalLight g_DirLight3; DirectionalLight g_DirLight4; DirectionalLight g_DirLight5; DirectionalLight g_DirLight6; DirectionalLight g_DirLight7; FlatMaterial g_FlatMat0; TexturedMaterial g_TexMat0; StrangeMaterial g_StrangeMat0; float4 main ( Material MyMaterial, float3 CurPos: CurPosition, float3 Normal : Normal, float2 TexCoord : TexCoord0) : SV_Target { float4 Ret; if (TestValueFromLight(g_DirLight0, CurPos, Normal) > 0.5) { MyMaterial.Perturb(CurPos, Normal, TexCoord); } Ret.xyz = MyMaterial.CalculateLitColor(CurPos, Normal, TexCoord); Ret.w = 1; return Ret; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -