#define IS_FX_FILE #include "modeDef.h" Texture2D FPtexDiff; // ディフューズ Texture2D FPtexAmb; // スペキュラ Texture2D FPtexNorm; // 法線 Texture2D FPtexPos; // 位置 Texture2D FPtexDepth; // 深度 Texture2D FPtexRef; // 反射 Texture2D FPtexLightResult; // ライト計算蓄積バッファ Texture2D FPtexPShadow; // 投影シャドウ SamplerState PointSampler { Filter = MIN_MAG_MIP_POINT; AddressU = Clamp; AddressV = Clamp; }; SamplerState LinearSample { Filter = MIN_MAG_MIP_LINEAR; AddressU = Clamp; AddressV = Clamp; }; DepthStencilState DisableDepth { DepthEnable = FALSE; DepthWriteMask = ZERO; StencilEnable = true; StencilReadMask = 0xFF; StencilWriteMask = 0xFF; FRONTFACESTENCILFUNC = ALWAYS; // FRONTFACESTENCILFUNC = GREATER_EQUAL; }; BlendState NoBlend { BlendEnable[0] = FALSE; BlendEnable[1] = FALSE; BlendEnable[2] = FALSE; BlendEnable[3] = FALSE; BlendEnable[4] = FALSE; BlendEnable[5] = FALSE; BlendEnable[6] = FALSE; BlendEnable[7] = FALSE; }; //=================================================================================================== // 共通 //=================================================================================================== struct QuadVS_Input { float4 Pos : POSITION; float2 Tex : TEXCOORD0; }; struct QuadVS_Output { float4 Pos : SV_POSITION; // Transformed position float2 Tex : TEXCOORD0; }; QuadVS_Output QuadVS( QuadVS_Input Input ) { QuadVS_Output Output; Output.Pos = Input.Pos; Output.Tex = Input.Tex; return Output; }; //=================================================================================================== // 入力 //=================================================================================================== cbuffer cb1 { float4x4 g_mInvProj; // 射影行列の逆行列 float4 g_PosEye; // カメラ位置,zはファークリップ距離 //// フォグ //float4 fogColor; //float fogNear; //float fogFar; //bool fogEnable; //bool debugLineDisp; //float fogMapScale; //float4 fogMapOffset; //float fogMapColorOffset; //float fogMapColorGain; //float fogMapBlendRate; //// 高さフォグ //float4 hfogColor; //float hfogNear; //float hfogFar; //bool hfogEnable; }; //=================================================================================================== // ファイナルパス //=================================================================================================== float4 FinalPass( QuadVS_Output Input, uniform int type ) : SV_TARGET { float4 vColor; switch(type){ case DR_MODE_FINAL: // ディフューズライト+スペキュラライト vColor = FPtexLightResult.Sample( LinearSample, Input.Tex ); // 影反映 //float shadow = FPtexNorm.Sample( LinearSample, Input.Tex ).a; //vColor *= (1-shadow)/2 + 0.5; //スカイボックスを上書きしないために、αテスト(暫定) if(vColor.a == 0) discard; vColor = max(vColor, float4(0,0,0,0)); // なんか、凄い小さい値が混じって、トーンマップを破壊することがある… break; case DR_MODE_MAT_AMBIENT: // マテリアルアンビエント vColor = FPtexAmb.Sample( PointSampler, Input.Tex ); break; case DR_MODE_MAT_DIFFUSE: // ディフューズ vColor = FPtexDiff.Sample( PointSampler, Input.Tex ); break; case DR_MODE_MAT_SPECULAR: // スペキュラ vColor = FPtexDiff.Sample( PointSampler, Input.Tex ).aaaa; break; case DR_MODE_REFLECTION: // 反射 vColor = FPtexRef.Sample( PointSampler, Input.Tex ); break; case DR_MODE_NORMAL_MAP: // 法線 vColor = float4(FPtexNorm.Sample( PointSampler, Input.Tex )); // 法線テクスチャがSNORMの場合 if(0){ vColor.z = -vColor.z; // 青マップっぽくするためにZ逆転 vColor = float4((vColor + float4(1,1,1,0)) / 2) ; } // 法線テクスチャがUNORMの場合 if(1){ vColor.z = 1 - vColor.z; // 青マップっぽくするためにZ逆転 } break; case DR_MODE_VIEW_POS: // 位置 vColor = FPtexPos.Sample( PointSampler, Input.Tex ); vColor /= 100.0f; break; case DR_MODE_DEPTH: // 深度バッファ /* float fDepth = FPtexDepth.Sample( PointSampler, Input.Tex ).r; float2 rpojXY = Input.Tex * 2 - float2(1.0f, 1.0f); float4 fDepthSample = mul( float4( rpojXY, fDepth, 1), g_mInvProj ); fDepth = fDepthSample.z / fDepthSample.w / g_FarClip; vColor = float4(fDepth,fDepth,fDepth,1); */ // カメラカラの距離 = 深度 float len2 = length ( g_PosEye.xyz - FPtexPos.Sample( PointSampler, Input.Tex ).xyz); float fDepth = len2 / g_PosEye.w; vColor = float4(fDepth,fDepth,fDepth,1); break; case DR_MODE_LIGHT_AMBIENT: // ディフューズライト case DR_MODE_LIGHT_DIFF: // スペキュラライト case DR_MODE_LIGHT_SPECULAR: // スペキュラライト case DR_MODE_ENVIRONMENT: case DR_MODE_EMISSIVE_RESULT: // スペキュラライト vColor = FPtexLightResult.Sample( PointSampler, Input.Tex ); break; case DR_MODE_SHADOW: // 影 //float color = FPtexNorm.Sample( PointSampler, Input.Tex ).a; // vColor = float4(color,color,color,1); vColor = FPtexLightResult.Sample( PointSampler, Input.Tex ); break; case DR_MODE_SHADOW_TEX: // 影テクスチャ vColor = FPtexPShadow.Sample( PointSampler, Input.Tex ); break; default : break; } return float4( vColor.rgb, 1.0f ); } int final_path_mode; PixelShader ps[] = { CompileShader( ps_4_0, FinalPass(0)), CompileShader( ps_4_0, FinalPass(1)), CompileShader( ps_4_0, FinalPass(2)), CompileShader( ps_4_0, FinalPass(3)), CompileShader( ps_4_0, FinalPass(4)), CompileShader( ps_4_0, FinalPass(5)), CompileShader( ps_4_0, FinalPass(6)), CompileShader( ps_4_0, FinalPass(7)), CompileShader( ps_4_0, FinalPass(8)), CompileShader( ps_4_0, FinalPass(9)), CompileShader( ps_4_0, FinalPass(10)), CompileShader( ps_4_0, FinalPass(11)), CompileShader( ps_4_0, FinalPass(12)), CompileShader( ps_4_0, FinalPass(13)), CompileShader( ps_4_0, FinalPass(14)), CompileShader( ps_4_0, FinalPass(15)), }; technique10 FinalPass_FP0 { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( ps[final_path_mode] ); SetBlendState( NoBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); SetDepthStencilState( DisableDepth, 1 ); } }