//================================================================== // ゴッドレイレンダリング //================================================================== #include "../../../Ext/xelib/Include/xelib/System/Draw/modeDef.h" //================================================================== // 定数 //================================================================== Texture2D g_GRY_texture_base; ///< イメージ Texture2D g_GRY_addMask; ///< 積算用マスク Texture2D g_ResourceTexture; ///< float2 g_GRY_PinpointBlurMove = float2( 0.0f, 0.0f ); float4 g_GRY_center_pos; float g_GRY_TU; float g_GRY_TV; float g_GRY_BlurPower; float4 g_GRY_Translate; float2 g_GRY_Offsets[8] = { float2(0.0f, 0.8f), float2(0.0f, 0.7f), float2(0.0f, 0.6f), float2(0.0f, 0.5f), float2(0.0f, 0.4f), float2(0.0f, 0.3f), float2(0.0f, 0.2f), float2(0.0f, 0.1f), }; float2 blofs00 = float2( 0.000f, 0.001f )*2.0f; float2 blofs01 = float2( 0.000f, -0.001f )*2.0f; float2 blofs02 = float2( 0.001f, 0.000f )*2.0f; float2 blofs03 = float2( -0.001f, 0.000f )*2.0f; float2 blofs04 = float2( 0.001f, 0.001f )*2.0f; float2 blofs05 = float2( 0.001f, -0.001f )*2.0f; float2 blofs06 = float2( -0.001f, 0.001f )*2.0f; float2 blofs07 = float2( -0.001f, -0.001f )*2.0f; float2 blofs08 = float2( 0.000f, 0.002f )*3.0f; float2 blofs09 = float2( 0.000f, -0.002f )*3.0f; float2 blofs10 = float2( 0.002f, 0.000f )*3.0f; float2 blofs11 = float2( -0.002f, 0.000f )*3.0f; float2 blofs12 = float2( 0.002f, 0.002f )*3.0f; float2 blofs13 = float2( 0.002f, -0.002f )*3.0f; float2 blofs14 = float2( -0.002f, 0.002f )*3.0f; float2 blofs15 = float2( -0.002f, -0.002f )*3.0f; float2 blofs16 = float2( 0.000f, 0.003f )*4.0f; float2 blofs17 = float2( 0.000f, -0.003f )*4.0f; float2 blofs18 = float2( 0.003f, 0.000f )*4.0f; float2 blofs19 = float2( -0.003f, 0.000f )*4.0f; float2 blofs20 = float2( 0.003f, 0.003f )*4.0f; float2 blofs21 = float2( 0.003f, -0.003f )*4.0f; float2 blofs22 = float2( -0.003f, 0.003f )*4.0f; float2 blofs23 = float2( -0.003f, -0.003f )*4.0f; // サンプルステート SamplerState samLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; SamplerState samPoint { Filter = MIN_MAG_MIP_POINT; AddressU = Wrap; AddressV = Wrap; }; SamplerState samPointMipLinear { Filter = MIN_MAG_POINT_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; SamplerState samAnisotropic { Filter = ANISOTROPIC; AddressU = Wrap; AddressV = Wrap; AddressW = CLAMP; }; SamplerState LinearSampler { Filter = MIN_MAG_MIP_LINEAR; AddressU = Clamp; AddressV = Clamp; }; // サンプリング float4 SampleTex( Texture2D tex, float2 uv) { return tex.Sample( samAnisotropic, uv); } // ブレンドステート BlendState SrcAlphaBlending { AlphaToCoverageEnable = FALSE; BlendEnable[0] = TRUE; SrcBlend = SRC_ALPHA; DestBlend = INV_SRC_ALPHA; BlendOp = ADD; SrcBlendAlpha = ONE; DestBlendAlpha = INV_SRC_ALPHA; BlendOpAlpha = ADD; RenderTargetWriteMask[0] = 0x0F; }; BlendState AddBlend { BlendEnable[0] = TRUE; BlendEnable[1] = TRUE; SrcBlend = ONE; DestBlend = ONE; BlendOp = ADD; }; //================================================================== // グローバル変数(設定) //================================================================== //================================================================== // シェーダー //================================================================== struct VS_Input { float4 Pos : POSITION; float2 m_uv : TEXCOORD0; }; struct VS_Output { float4 Pos : SV_POSITION; float2 m_uv : TEXCOORD0; }; ///< シェーダー VS_Output QuadVS( VS_Input Input ) { VS_Output Output; Output.Pos = Input.Pos; Output.m_uv = Input.m_uv; return Output; } VS_Output QuadTransVS( VS_Input Input ) { VS_Output Output; Output.Pos = Input.Pos; Output.Pos.x += g_GRY_Translate.x; Output.Pos.y += g_GRY_Translate.y; Output.m_uv = Input.m_uv; return Output; } ///< ピクセルシェーダー(白黒画像作成) float4 QuadPSMask( VS_Output input ):SV_TARGET { if ( !g_GRY_texture_base.Sample( samPointMipLinear, input.m_uv ).a ) discard; return float4( 0.0f, 0.0f, 0.0f, 1.0f );///< 色があるところは黒で塗りつぶす } ///< カラーマスク(揺らしてオレンジ色を抽出) float4 QuadPSColorMask( VS_Output input ):SV_TARGET { #if 0 //ブラーの中心位置 ← 現在のテクセル位置 float2 dir = g_GRY_center_pos.xy - input.m_uv; //距離を計算する float len = length( dir )*1.3f; if ( len >= 1.0f ) len=1.0f; float col = (1.0f-len)*0.6f; float4 output = float4( col, col, col, 1.0f ); return output; #endif float4 ofs = g_ResourceTexture.Sample( samLinear, input.m_uv );///< ゆらぎを持たせる //ofs*=0.05f; float2 rotate = float2( 0.0f, 0.0f ); rotate.y = cos( ofs.r + ofs.g + ofs.b + input.m_uv.y*100.0f + g_GRY_PinpointBlurMove.y ) * 0.0020f; //rotate.y = sin( input.m_uv.x*100.0f + g_GRY_PinpointBlurMove.y ) * 0.0025f * ofs.g; float4 color = g_GRY_texture_base.Sample( samLinear, input.m_uv+rotate ); if ( color.r > 0.3 && color.g > 0.3f && color.b <= 0.15f ) { ///< オレンジ色 } else { color = float4( 0.0f, 0.0f, 0.0f, 1.0f ); } return color; } ///< 乗算マスク作成 float4 QuadPSBlur( VS_Output input ):SV_TARGET { #if 1 float4 color = g_GRY_texture_base.Sample( samLinear, input.m_uv ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs00 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs01 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs02 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs03 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs04 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs05 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs06 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs07 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs08 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs09 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs10 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs11 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs12 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs13 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs14 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs15 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs16 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs17 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs18 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs19 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs20 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs21 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs22 ); color += g_GRY_texture_base.Sample( samLinear, input.m_uv+blofs23 ); //color *= 0.125f; color *= 0.0625f; return color; #endif #if 0 ///< 横揺れ float ofs_x = sin( Input.m_uv.y*64.0f )*0.005; float4 color = g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2( 0.00f + ofs_x, -0.01f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2( 0.00f + ofs_x, 0.01f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2(-0.01f + ofs_x, 0.00f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2( 0.01f + ofs_x, 0.00f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2(-0.01f + ofs_x, 0.01f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2( 0.01f + ofs_x, -0.01f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2(-0.01f + ofs_x, -0.01f) ) +g_GRY_texture_base.Sample( samLinear, Input.m_uv+float2( 0.01f + ofs_x, 0.01f) ); return color*0.125f*0.3f;///< 加算で //return color*3.0f;///< 加算で #endif #if 0 float4 color = g_GRY_texture_base.Sample( samLinear, input.m_uv ); float4 vSample = 0.0f; float4 vColor = 0.0f; float2 vSamplePosition; // Sample from eight points along the star line for(int iSample = 0; iSample < 8; iSample++) { vSamplePosition = input.m_uv + g_GRY_Offsets[iSample].xy; vSample = g_GRY_texture_base.Sample( samLinear, vSamplePosition); //vColor += g_avSampleWeightsStar[iSample] * vSample; vColor = vSample; } return vColor; #endif #if 0 float2 dir; dir.x =32.0f; dir.y =32.0f; return g_GRY_texture_base.Sample( samLinear, Input.m_uv ) * 0.19f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir ) * 0.17f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 2.0f ) * 0.15f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 3.0f ) * 0.13f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 4.0f ) * 0.11f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 5.0f ) * 0.09f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 6.0f ) * 0.07f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 7.0f ) * 0.05f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 8.0f ) * 0.03f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 9.0f ) * 0.01f; #endif #if 0 //ブラーの中心位置 ← 現在のテクセル位置 float2 dir = g_GRY_center_pos.xy - Input.m_uv; //距離を計算する //方向ベクトルの正規化し、1テクセル分の長さとなる方向ベクトルを計算する //g_GRY_BlurPower でボケ具合を調整する //距離を積算することにより、爆発の中心位置に近いほどブラーの影響が小さくなるようにする dir = normalize( dir ) * float2( g_GRY_TU, g_GRY_TV ) * g_GRY_BlurPower * length( dir ); //合成する return g_GRY_texture_base.Sample( samLinear, Input.m_uv ) * 0.19f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir ) * 0.17f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 2.0f ) * 0.15f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 3.0f ) * 0.13f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 4.0f ) * 0.11f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 5.0f ) * 0.09f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 6.0f ) * 0.07f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 7.0f ) * 0.05f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 8.0f ) * 0.03f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 9.0f ) * 0.01f; #endif } ///< 放射ブラー float4 QuadPSRadiate( VS_Output Input ) : SV_TARGET { //ブラーの中心位置 ← 現在のテクセル位置 float2 dir = g_GRY_center_pos.xy - Input.m_uv; //距離を計算する //方向ベクトルの正規化し、1テクセル分の長さとなる方向ベクトルを計算する //g_GRY_BlurPower でボケ具合を調整する //距離を積算することにより、爆発の中心位置に近いほどブラーの影響が小さくなるようにする dir = normalize( dir ) * float2( g_GRY_TU, g_GRY_TV ) * g_GRY_BlurPower * length( dir ); //合成する return g_GRY_texture_base.Sample( samLinear, Input.m_uv ) * 0.19f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir ) * 0.17f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 2.0f ) * 0.15f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 3.0f ) * 0.13f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 4.0f ) * 0.11f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 5.0f ) * 0.09f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 6.0f ) * 0.07f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 7.0f ) * 0.05f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 8.0f ) * 0.03f + g_GRY_texture_base.Sample( samLinear, Input.m_uv + dir * 9.0f ) * 0.01f; } ///< 合成表示 float4 QuadPS( VS_Output input ) : SV_TARGET { float4 output = g_GRY_texture_base.Sample( samPointMipLinear, input.m_uv ); if ( !output.a ) discard; //float4 addMCol = g_GRY_addMask.Sample( samLinear, input.m_uv ); //return (g_ResourceTexture.Sample( samAnisotropic, input.m_uv ) + output); return (output); } ///< そのまま表示 係数無し float4 QuadPSNormal( VS_Output input ) : SV_TARGET { float4 output = g_GRY_texture_base.Sample( samPointMipLinear, input.m_uv ); if ( !output.a ) discard; if ( output.r + output.g + output.b == 0.0f )discard; return output; } ///<----------------------------------------------------------------- ///< マスク作成 ///< 00 technique10 maskRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPSMask() ) ); //SetDepthStencilState( DisableDepthAndStencilMapNotEqual, OBJ_STENCIL_ID_MAP ); //SetBlendState( AddBlend, float4(0,0,0,0), 0xFFFFFFFF ); } } ///< 01 technique10 addColorRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPSColorMask() ) ); //SetDepthStencilState( DisableDepthAndStencilMapNotEqual, OBJ_STENCIL_ID_MAP ); //SetBlendState( AddBlend, float4(0,0,0,0), 0xFFFFFFFF ); } } ///< 02 ///< 放射ブラー画像作成 technique10 RadiateRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPSRadiate() ) ); //SetDepthStencilState( DisableDepthAndStencilMapNotEqual, OBJ_STENCIL_ID_MAP ); //SetBlendState( AddBlend, float4(0,0,0,0), 0xFFFFFFFF ); } } ///< 03 ///< 通常画像表示 technique10 NormarRateRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPS() ) ); } } ///< 04 ///< 通常画像表示 technique10 NormarRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadTransVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPSNormal() ) ); } } ///< 05 technique10 BlurRender { pass p0 { SetVertexShader( CompileShader( vs_4_0, QuadVS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, QuadPSBlur() ) ); //SetDepthStencilState( DisableDepthAndStencilMapNotEqual, OBJ_STENCIL_ID_MAP ); //SetBlendState( AddBlend, float4(0,0,0,0), 0xFFFFFFFF ); } }