Microsoft DirectX 8.0 (C++)

エフェクト ファイルのサンプル

次のエフェクト ファイルは、Water サンプルに使用するものである。

このファイルには、最初にこのエフェクトで使用する 2 つの行列、3 つのテクスチャ、および頂点シェーダが宣言されている。

matrix mID;     // 単位トランスフォーム
matrix mENV;    // 環境マップ トランスフォーム

texture tFLR;   // フロア テクスチャ
texture tCAU;   // コースティック テクスチャ
texture tENV;   // キューブ環境マップ

vertexshader vs =  decl { fvf xyz | normal | diffuse | tex1; };

最初のテクニックでは、フロア テクスチャとコースティック テクスチャを使って、水のシーンをレンダリングする。水とフロアには光が反射する。このテクニックでは、単一のパスと 4 つのテクスチャ ステージ ステートを使用する。

technique T0
{
    vertexshader = <vs>;

    pass P0
    {        
        Lighting       = True;
        SpecularEnable = True;

        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        AlphaOp[0]   = SelectArg2;
        AlphaArg2[0] = Current;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tFLR>;
        TextureTransform[0] = <mID>;
        TextureTransformFlags[0] = Count2;


        // ステージ 1
        ColorOp[1]   = Add;
        ColorArg1[1] = Texture;
        ColorArg2[1] = Current;
        AlphaOp[1]   = SelectArg2;
        AlphaArg2[1] = Current;

        MinFilter[1] = Linear;
        MagFilter[1] = Linear;
        MipFilter[1] = Point;

        Texture[1] = <tCAU>;
        TextureTransform[1] = <mID>;
        TextureTransformFlags[1] = Count2;


        // ステージ 2
        ColorOp[2]   = BlendCurrentAlpha;
        ColorArg1[2] = Texture;
        ColorArg2[2] = Current;
        AlphaOp[2]   = Disable;

        MinFilter[2] = Linear;
        MagFilter[2] = Linear;
        MipFilter[2] = Point;

        Texture[2] = <tENV>;
        TextureTransform[2] = <mENV>;
        TextureTransformFlags[2] = Count3;
        TexCoordIndex[2] = CameraSpaceReflectionVector;


        // ステージ 3
        ColorOp[3] = Disable;
        AlphaOp[3] = Disable;
    }
}

2 番目のテクニックでは、フロア テクスチャとコースティック テクスチャを使って、水のシーンレンダリングする。フロアと水には光が反射する。このテクニックでは、2 つのパスを使ってシーンをレンダリングする。

technique T1
{
    vertexshader = <vs>;

    pass P0
    {
        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        AlphaOp[0]   = Disable;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tFLR>;
        TextureTransform[0] = <mID>;
        TextureTransformFlags[0] = Count2;


        // ステージ 1
        ColorOp[1]   = Add;
        ColorArg1[1] = Texture;
        ColorArg2[1] = Current;
        AlphaOp[1]   = Disable;

        MinFilter[1] = Linear;
        MagFilter[1] = Linear;
        MipFilter[1] = Point;

        Texture[1] = <tCAU>;
        TextureTransform[1] = <mID>;
        TextureTransformFlags[1] = Count2;


        // ステージ 2
        ColorOp[2] = Disable;
        AlphaOp[2] = Disable;
    }


    pass P1
    {
        SrcBlend  = One;
        DestBlend = InvSrcAlpha;

        Lighting         = True;
        SpecularEnable   = True;
        AlphaBlendEnable = True;


        // ステージ 0
        ColorOp[0]   = BlendDiffuseAlpha;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Diffuse;
        AlphaOp[0]   = SelectArg2;
        AlphaArg2[0] = Diffuse;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tENV>;
        TextureTransform[0] = <mENV>;
        TextureTransformFlags[0] = Count3;
        TexCoordIndex[0] = CameraSpaceReflectionVector;


        // ステージ 1
        ColorOp[1] = Disable;
        AlphaOp[1] = Disable;
    }
}

3 番目のテクニックでは、フロア テクスチャとコースティック テクスチャを使って、水のシーンをレンダリングする。水面には光が反射する。このエフェクトでは、3 つのパスを使ってシーンをレンダリングする。

technique T2
{
    vertexshader = <vs>;

    pass P0
    {
        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        AlphaOp[0]   = Disable;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tFLR>;
        TextureTransform[0] = <mID>;
        TextureTransformFlags[0] = Count2;

        // ステージ 1
        ColorOp[1] = Disable;
        AlphaOp[1] = Disable;
    }


    pass P1
    {
        SrcBlend  = One;
        DestBlend = One;

        Lighting         = False;
        SpecularEnable   = True;
        AlphaBlendEnable = True;


        // ステージ 0
        ColorOp[0]   = Add;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Current;
        AlphaOp[0]   = Disable;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tCAU>;
        TextureTransform[0] = <mID>;
        TextureTransformFlags[0] = Count2;


        // ステージ 1
        ColorOp[1] = Disable;
        AlphaOp[1] = Disable;
    }


    pass P2
    {
        SrcBlend  = One;
        DestBlend = InvSrcAlpha;

        Lighting         = True;
        SpecularEnable   = True;
        AlphaBlendEnable = True;


        // ステージ 0
        ColorOp[0]   = BlendDiffuseAlpha;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Diffuse;
        AlphaOp[0]   = SelectArg2;
        AlphaArg2[0] = Diffuse;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0] = <tENV>;
        TextureTransform[0] = <mENV>;
        TextureTransformFlags[0] = Count3;
        TexCoordIndex[0] = CameraSpaceReflectionVector;


        // ステージ 1
        ColorOp[1] = Disable;
        AlphaOp[1] = Disable;
    }
}

4 番目のテクニックでは、フロア テクスチャとコースティック テクスチャを使って、水のシーンをレンダリングする。このエフェクトでは、単一のパスを使ってシーンをレンダリングする。

technique T3
{
    vertexshader = <vs>;

    pass P0
    {
        Lighting       = True;
        SpecularEnable = True;


        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        AlphaOp[0]   = Disable;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0]   = <tFLR>;


        // ステージ 1
        ColorOp[1]   = Add;
        ColorArg1[1] = Texture;
        ColorArg2[1] = Current;
        AlphaOp[1]   = Disable;

        MinFilter[1] = Linear;
        MagFilter[1] = Linear;
        MipFilter[1] = Point;

        Texture[1]   = <tCAU>;


        // ステージ 2
        ColorOp[2]   = Disable;
        AlphaOp[2]   = Disable;
    }
}

5 番目のテクニックでは、フロア テクスチャとコースティック テクスチャを使って、水のシーンをレンダリングする。このテクニックでは反射は使用しない。このエフェクトでは、2 つのパスを使ってシーンをレンダリングする。

technique T4
{
    vertexshader = <vs>;

    pass P0
    {
        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Diffuse;

        AlphaOp[0]   = SelectArg1;
        AlphaArg1[0] = Texture;
        AlphaArg2[0] = Diffuse;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0]   = <tFLR>;


        // ステージ 1
        ColorOp[1]   = Disable;
        AlphaOp[1]   = Disable;
    }


    pass P1
    {
        SrcBlend  = One;
        DestBlend = One;

        Lighting         = True;
        SpecularEnable   = True;
        AlphaBlendEnable = True;


        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Current;

        AlphaOp[0]   = SelectArg1;
        AlphaArg1[0] = Texture;
        AlphaArg2[0] = Current;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = Point;

        Texture[0]   = <tCAU>;


        // ステージ 1
        ColorOp[1]   = Disable;
        AlphaOp[1]   = Disable;
    }
}

6 番目および最後のテクニックでは、フロア テクスチャだけを使って、水のシーンをレンダリングする。このテクニックでは反射は使用しない。このエフェクトでは、単一のパスを使ってシーンをレンダリングする。

technique T5
{
    vertexshader = <vs>;

    pass P0
    {
        Lighting       = True;
        SpecularEnable = True;


        // ステージ 0
        ColorOp[0]   = SelectArg1;
        ColorArg1[0] = Texture;
        ColorArg2[0] = Current;

        AlphaOp[0]   = SelectArg1;
        AlphaArg1[0] = Texture;
        AlphaArg2[0] = Current;

        MinFilter[0] = Linear;
        MagFilter[0] = Linear;
        MipFilter[0] = None;

        Texture[0]   = <tFLR>;

        // ステージ 1
        ColorOp[1]   = Disable;
        AlphaOp[1]   = Disable;
    }
}