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