0001: // ---------------------------------------------------------------------------
0002: // 頂点シェーダ入力データ
0003: // ---------------------------------------------------------------------------
0004: struct appdata
0005: {
0006:     float4 position : POSITION;
0007:     float3 normal   : NORMAL;
0008:     float3 color    : DIFFUSE;
0009: };
0010: 
0011: // ---------------------------------------------------------------------------
0012: // 頂点シェーダ出力データ
0013: // ---------------------------------------------------------------------------
0014: struct vfconn
0015: {
0016:     float4 HPOS : POSITION;
0017:     float4 COL0 : COLOR0;
0018:     float4 COL1 : COLOR1;
0019: };
0020: 
0021: // ---------------------------------------------------------------------------
0022: // Phong shading 頂点シェーダプログラム
0023: // ---------------------------------------------------------------------------
0024: vfconn main(appdata IN
0025:             , uniform float4x4 WorldViewProj
0026:             , uniform float4x4 World
0027:             , uniform float4   Light
0028:             )
0029: {
0030:     vfconn OUT;
0031: 
0032:     OUT.HPOS = mul(WorldViewProj, IN.position);
0033:     
0034:     // 頂点色
0035:     OUT.COL0.xyz = IN.color.xyz * (                         // モデルの色
0036:                       0.3f                                  // 環境光
0037:                     + 0.3f * dot(IN.normal.xyz, Light.xyz));// 拡散光
0038:     OUT.COL0.w = 1.0;
0039:     
0040:     // ワールド座標系の法線ベクトル
0041:     float4 n = IN.normal.xyzz;
0042:     n = mul(World, n);
0043: 
0044:     // 法線ベクトルを色で格納
0045:     OUT.COL1.xyz = 0.5f * n.xyz + 0.5f;
0046:     OUT.COL1.w = 0.5;
0047: 
0048:     return OUT;
0049: }
0050: