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: