// @file Sprite2dShader.fx // @brief 簡易2Dスプライト用エフェクトファイル // @author K.Kajiki // @version $Id: Sprite2dShader.fx 6158 2012-12-18 06:42:54Z kajiki-kengo-xeen $ #define SCREEN_WID (1360) #define SCREEN_HEI (768) // テクスチャサンプラステート。線形補間 SamplerState samplerLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; // 頂点シェーダーの入力 DrawInstance用 struct VS_INPUT { float2 m_ax : AFFINEX; // アフィンX float2 m_ay : AFFINEY; // アフィンY float2 m_size : SIZE; // 表示サイズ float2 m_t : TRANS; // 座標 float4 m_uv : TEXCOORD; // UV float4 m_moduColor : MODUCOLOR; // 乗算色 float4 m_ofsColor : OFSCOLOR; // オフセット色 uint m_FlipType : FLIPTYPE; // 反転タイプ //uint vertID : SV_VertexID; //uint m_channel : CHANNEL; }; // 頂点シェーダーの入力 DrawInstance用 struct VS_INPUT2 { float2 m_ax : AFFINEX; // アフィンX float2 m_ay : AFFINEY; // アフィンY float2 m_size : SIZE; // 表示サイズ float2 m_t : TRANS; // 座標 float4 m_uv : TEXCOORD; // UV float4 m_moduColor : MODUCOLOR; // 乗算色 float4 m_ofsColor : OFSCOLOR; // オフセット色 uint vertID : SV_VertexID; //uint m_channel : CHANNEL; }; struct PS_INPUT { float4 m_Pos : SV_POSITION; // 座標 float2 m_uv : TEXCOORD0; // uv float4 m_moduColor : MODUCOLOR; /// 乗算色 float4 m_ofsColor : OFSCOLOR; /// オフセット色 }; typedef PS_INPUT GS_OUTPUT; matrix ortho2dMtx; // 射影変換用 Texture2D g_texture; // テクスチャ Texture2D g_maskTexture; // マスク用テクスチャ Texture2D g_model3dMaskTexture; const static float3 vtxArray[4] = { {0, 0, 1}, {1, 0, 1}, {0, 1, 1}, {1, 1, 1}, //{1, 1, 1}, //{0, 1, 1}, }; const static float3 uvArrays[4][4] = { { // フリップなし {0, 0, 1}, {1, 0, 1}, {0, 1, 1}, {1, 1, 1}, }, { // 縦方向フリップ {0, 1, 1}, {1, 1, 1}, {0, 0, 1}, {1, 0, 1}, }, { // 横方向フリップ {1, 0, 1}, {0, 0, 1}, {1, 1, 1}, {0, 1, 1}, }, { // 縦横フリップ {1, 1, 1}, {0, 1, 1}, {1, 0, 1}, {0, 0, 1}, }, }; // 頂点シェーダー DrawInstance用 VS_INPUT VS(VS_INPUT input) { // ジオメトリシェーダで頂点設定をするので // ここでは入力値をそのまま返すだけ return input; } // 頂点シェーダー DrawInstance用 PS_INPUT VS2(VS_INPUT2 input) { PS_INPUT output = (PS_INPUT)0; // 表示サイズ配列 float3 dispSizeArray[4] = { {0, 0, 1}, {input.m_size.x, 0, 1}, {0, input.m_size.y, 1}, {input.m_size.x, input.m_size.y, 1}, }; float3 vtx = dispSizeArray[input.vertID % 4]; float2 uv = vtxArray[input.vertID % 4].xy; // 頂点変換 float3x3 mtx = { input.m_ax.x, input.m_ax.y, input.m_t.x, input.m_ay.x, input.m_ay.y, input.m_t.y, 0, 0, 1 }; output.m_Pos = float4(mul(mtx, vtx), 1); // 射影変換 output.m_Pos = mul(output.m_Pos, ortho2dMtx); // UV設定 output.m_uv = input.m_uv.xy + uv * input.m_uv.zw; // 乗算色設定 output.m_moduColor = input.m_moduColor; // オフセット色設定 output.m_ofsColor = input.m_ofsColor; return output; } // ジオメトリシェーダ。1頂点ずつ設定。 [maxvertexcount(4)] void GS(point VS_INPUT input[1], inout TriangleStream gsstream) { PS_INPUT output = (PS_INPUT)0; float3 vtx = {0, 0, 0}; float2 uv = {0, 0}; uint flipType = input[0].m_FlipType; // 表示サイズ配列 float3 dispSizeArray[4] = { {0, 0, 1}, {input[0].m_size.x, 0, 1}, {0, input[0].m_size.y, 1}, {input[0].m_size.x, input[0].m_size.y, 1}, //{input[0].m_size.x, input[0].m_size.y, 1}, //{0, input[0].m_size.y, 1}, }; for (int i = 0; i < 4; i++) { vtx = dispSizeArray[i]; uv = uvArrays[flipType][i].xy; // 頂点変換 float3x3 mtx = { input[0].m_ax.x, input[0].m_ax.y, input[0].m_t.x, input[0].m_ay.x, input[0].m_ay.y, input[0].m_t.y, 0, 0, 1 }; output.m_Pos = float4(mul(mtx, vtx), 1); // 射影変換 output.m_Pos = mul(output.m_Pos, ortho2dMtx); // UV設定 output.m_uv = input[0].m_uv.xy + uv * input[0].m_uv.zw; // 乗算色設定 output.m_moduColor = input[0].m_moduColor; // オフセット色設定 output.m_ofsColor = input[0].m_ofsColor; gsstream.Append(output); } gsstream.RestartStrip(); } // ジオメトリシェーダ [maxvertexcount(4)] void GS2(lineadj GS_OUTPUT In[4], inout TriangleStream gsstream) { gsstream.Append(In[0]); gsstream.Append(In[1]); gsstream.Append(In[2]); gsstream.Append(In[3]); gsstream.RestartStrip(); } // ピクセルシェーダ float4 PS(PS_INPUT input) : SV_Target { float4 texCol = g_texture.Sample(samplerLinear, input.m_uv); if (texCol.w == .0f) { discard; } float4 col = texCol * input.m_moduColor + input.m_ofsColor; if (col.w == .0f) { discard; } return col; } // ピクセルシェーダ。テクスチャ使わずに色だけ float4 PS_ColorOnly(PS_INPUT input) : SV_Target { float4 col = input.m_moduColor + input.m_ofsColor; if (col.w == .0f) { discard; } return col; } // ピクセルシェーダ。3Dモデルよりも奥に描いてるように見せるため float4 PS_LikePre3D(PS_INPUT input) : SV_Target { float4 texCol = g_texture.Sample(samplerLinear, input.m_uv); float2 depthTexUv = float2(input.m_Pos.x / SCREEN_WID, input.m_Pos.y / SCREEN_HEI); float depthTexCol = g_model3dMaskTexture.Sample(samplerLinear, depthTexUv).g; if (depthTexCol == 1) { discard; } if (texCol.w == .0f) { discard; } float4 col = texCol * input.m_moduColor + input.m_ofsColor; if (col.w == .0f) { discard; } return col; } // テクスチャが設定されていないときに使うピクセルシェーダ float4 PS_Dummy(PS_INPUT input) : SV_Target { return float4(1, 1, 1, 0); } // // マスク用ピクセルシェーダ // float4 PS_MASK(PS_INPUT input) : SV_Target { float4 texCol = g_texture.Sample(samplerLinear, input.m_uv); float2 maskUv = float2(input.m_Pos.x / SCREEN_WID, input.m_Pos.y / SCREEN_HEI); // レンダーターゲットテクスチャのアルファ値 float maskTexAlpha = g_maskTexture.Sample(samplerLinear, maskUv).a; if (texCol.a == .0f) { discard; } float4 col = texCol * input.m_moduColor + input.m_ofsColor; col.a *= maskTexAlpha; if (col.a == .0f) { discard; } return col; } float4 PS_MASK_LikePre3D(PS_INPUT input) : SV_Target { float4 texCol = g_texture.Sample(samplerLinear, input.m_uv); float2 maskUv = float2(input.m_Pos.x / SCREEN_WID, input.m_Pos.y / SCREEN_HEI); // レンダーターゲットテクスチャのアルファ値 float maskTexAlpha = g_maskTexture.Sample(samplerLinear, maskUv).a; float2 depthTexUv = float2(input.m_Pos.x / SCREEN_WID, input.m_Pos.y / SCREEN_HEI); float depthTexCol = g_model3dMaskTexture.Sample(samplerLinear, depthTexUv).g; if (depthTexCol == 1) { discard; } if (texCol.a == .0f) { discard; } float4 col = texCol * input.m_moduColor + input.m_ofsColor; col.a *= maskTexAlpha; if (col.a == .0f) { discard; } return col; } technique10 RenderInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS())); } pass P1 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_Dummy())); } } technique10 RenderDummyInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_Dummy())); } } technique10 RenderMaskInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_MASK())); } } technique10 RenderLikePre3DInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_LikePre3D())); } } technique10 RenderMaskLikePre3DInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_MASK_LikePre3D())); } } technique10 RenderColorOnly3DInstanced { pass P0 { SetVertexShader(CompileShader(vs_4_0, VS())); SetGeometryShader(CompileShader(gs_4_0, GS())); SetPixelShader(CompileShader(ps_4_0, PS_ColorOnly())); } } // EOF