0001: // -------------------------------------------------------------
0002: // HDR
0003: // 
0004: // Copyright (c) 2003-2004 IMAGIRE Takashi. All rights reserved.
0005: // -------------------------------------------------------------
0006: #include "paraboloid.fx"
0007: 
0008: 
0009: // -------------------------------------------------------------
0010: // グローバル変数
0011: // -------------------------------------------------------------
0012: float4x4 mWVP;
0013: float4x4 mWV;
0014: 
0015: // -------------------------------------------------------------
0016: // テクスチャ
0017: // -------------------------------------------------------------
0018: texture Texture;
0019: sampler Sampler = sampler_state
0020: {
0021:     Texture = <Texture>;
0022:     MinFilter = POINT;
0023:     MagFilter = POINT;
0024:     MipFilter = NONE;
0025: 
0026:     AddressU = Clamp;
0027:     AddressV = Clamp;
0028: };
0029: // -------------------------------------------------------------
0030: // アプリケーションから頂点シェーダに渡すデータ
0031: // -------------------------------------------------------------
0032: struct VS_INPUT
0033: {
0034:     float4 Pos          : POSITION;
0035:     float3 Normal       : NORMAL0;
0036:     float2 Tex          : TEXCOORD0;
0037: };
0038: // -------------------------------------------------------------
0039: // 頂点シェーダからピクセルシェーダに渡すデータ
0040: // -------------------------------------------------------------
0041: struct VS_OUTPUT
0042: {
0043:     float4 Pos          : POSITION;
0044:     float2 Tex          : TEXCOORD0;
0045: };
0046: 
0047: // -------------------------------------------------------------
0048: // 頂点シェーダプログラム
0049: // -------------------------------------------------------------
0050: VS_OUTPUT VS(VS_INPUT In)
0051: {   
0052:     VS_OUTPUT Out = (VS_OUTPUT)0;            // 出力データ
0053:     
0054:     // 位置座標
0055:     Out.Pos = mul( In.Pos, mWVP );
0056:     
0057:     // テクスチャ座標
0058:     Out.Tex = In.Tex;
0059:     
0060: 
0061:     return Out;
0062: }
0063: 
0064: // -------------------------------------------------------------
0065: // HDRをLDRに変換するピクセルシェーダプログラム
0066: // -------------------------------------------------------------
0067: float4 PS( VS_OUTPUT In ) : COLOR
0068: {   
0069:     float4 ldr = (float4)0;
0070:     
0071:     float4 hdr = tex2D( Sampler, In.Tex );
0072:     
0073:     ldr.rgb = saturate( hdr * pow(2, 256*(hdr.a - 0.5) ));
0074:     
0075:     return ldr;
0076: }
0077: 
0078: 
0079: // -------------------------------------------------------------
0080: // 放物マップ頂点シェーダプログラム
0081: // -------------------------------------------------------------
0082: VS_OUTPUT VS_DUAL( VS_INPUT In )
0083: {   
0084:     VS_OUTPUT Out = (VS_OUTPUT)0;            // 出力データ
0085:     
0086:     // 位置座標
0087:     Out.Pos = paraboloid( In.Pos, mWV );
0088:     
0089:     // テクスチャ座標
0090:     Out.Tex = In.Tex;
0091:     
0092:     return Out;
0093: }
0094: 
0095: // -------------------------------------------------------------
0096: // テクニック
0097: // -------------------------------------------------------------
0098: technique TShader
0099: {
0100:     pass P0
0101:     {
0102:         VertexShader = compile vs_1_1 VS();
0103:         PixelShader  = compile ps_2_0 PS();
0104:     }
0105:     pass P0
0106:     {
0107:         VertexShader = compile vs_1_1 VS_DUAL();
0108:         PixelShader  = compile ps_2_0 PS();
0109:     }
0110: }
0111: 
0112: