0001: // -------------------------------------------------------------
0002: // シャドウボリュームによる影
0003: // 
0004: // Copyright (c) 2002 IMAGIRE Takashi. All rights reserved.
0005: // -------------------------------------------------------------
0006: 
0007: // -------------------------------------------------------------
0008: // グローバル変数
0009: // -------------------------------------------------------------
0010: float4x4 mWVP;      // ローカルから射影空間への座標変換
0011: float4   vLightPos; // ライトの位置
0012: 
0013: // -------------------------------------------------------------
0014: // 頂点シェーダからピクセルシェーダに渡すデータ
0015: // -------------------------------------------------------------
0016: struct VS_OUTPUT
0017: {
0018:     float4 Pos      : POSITION;
0019: };
0020: 
0021: // -------------------------------------------------------------
0022: // 頂点シェーダプログラム
0023: // -------------------------------------------------------------
0024: VS_OUTPUT VS (
0025:       float4 Pos    : POSITION,          // モデルの頂点
0026:       float3 Normal : NORMAL             // モデルの法線
0027: ){
0028:     VS_OUTPUT Out = (VS_OUTPUT)0;        // 出力データ
0029:     
0030:     // 光の裏になっている面を後ろに引き伸ばす
0031:     float4 dir = vLightPos - Pos;
0032:     float LN = dot( Normal, dir );
0033:     float scale = (0<LN) ? 0.0f : 1.0f;
0034:     
0035:     // 座標変換
0036:     Pos.xyz -= 0.001f*Pos;// 縞がおきないように少し縮める
0037:     Out.Pos = mul( Pos - scale * dir, mWVP );
0038:     
0039:     return Out;
0040: }
0041: // -------------------------------------------------------------
0042: // テクニック
0043: // -------------------------------------------------------------
0044: technique TShader
0045: {
0046:     pass P0
0047:     {
0048:         // シェーダ
0049:         VertexShader = compile vs_1_1 VS();
0050:         PixelShader  = NULL;
0051:     }
0052: }
0053: