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;
    }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -