Files
2026-06-01 12:46:52 +02:00

342 lines
11 KiB
HLSL

// -------------------------------------------------------------
// 가우스필터
//
// Copyright (c) 2003 IMAGIRE Takashi. All rights reserved.
// -------------------------------------------------------------
// -------------------------------------------------------------
// 전역변수
// -------------------------------------------------------------
float MAP_WIDTH;
float MAP_HEIGHT;
float weight[8];
float2 offsetX;
float2 offsetY;
// -------------------------------------------------------------
// 텍스처
// -------------------------------------------------------------
texture SrcMap;
sampler SrcSamp = sampler_state
{
Texture = <SrcMap>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
};
// -------------------------------------------------------------
// 정점셰이더에서 픽셀셰이더로 넘기는 데이터
// -------------------------------------------------------------
struct VS_OUTPUT
{
float4 Pos : POSITION;
float2 Tex0 : TEXCOORD0;
float2 Tex1 : TEXCOORD1;
float2 Tex2 : TEXCOORD2;
float2 Tex3 : TEXCOORD3;
float2 Tex4 : TEXCOORD4;
float2 Tex5 : TEXCOORD5;
float2 Tex6 : TEXCOORD6;
float2 Tex7 : TEXCOORD7;
};
// -------------------------------------------------------------
// X뭉개기
// -------------------------------------------------------------
// -------------------------------------------------------------
// 정점셰이더
// -------------------------------------------------------------
VS_OUTPUT VS_pass1 (
float4 Pos : POSITION, // 모델정점
float4 Tex : TEXCOORD0 // 텍스처좌표
){
VS_OUTPUT Out = (VS_OUTPUT)0; // 출력데이터
// 위치좌표
Out.Pos = Pos;
Out.Tex0 = Tex + float2( - 1.0f/MAP_WIDTH, 0.0f );
Out.Tex1 = Tex + float2( - 3.0f/MAP_WIDTH, 0.0f );
Out.Tex2 = Tex + float2( - 5.0f/MAP_WIDTH, 0.0f );
Out.Tex3 = Tex + float2( - 7.0f/MAP_WIDTH, 0.0f );
Out.Tex4 = Tex + float2( - 9.0f/MAP_WIDTH, 0.0f );
Out.Tex5 = Tex + float2( -11.0f/MAP_WIDTH, 0.0f );
Out.Tex6 = Tex + float2( -13.0f/MAP_WIDTH, 0.0f );
Out.Tex7 = Tex + float2( -15.0f/MAP_WIDTH, 0.0f );
return Out;
}
// -------------------------------------------------------------
// 픽셀셰이더
// -------------------------------------------------------------
float4 PS_pass1(VS_OUTPUT In) : COLOR
{
float4 Color;
Color = weight[0] * (tex2D( SrcSamp, In.Tex0 )
+ tex2D( SrcSamp, In.Tex7 + offsetX ));
Color += weight[1] * (tex2D( SrcSamp, In.Tex1 )
+ tex2D( SrcSamp, In.Tex6 + offsetX ));
Color += weight[2] * (tex2D( SrcSamp, In.Tex2 )
+ tex2D( SrcSamp, In.Tex5 + offsetX ));
Color += weight[3] * (tex2D( SrcSamp, In.Tex3 )
+ tex2D( SrcSamp, In.Tex4 + offsetX ));
Color += weight[4] * (tex2D( SrcSamp, In.Tex4 )
+ tex2D( SrcSamp, In.Tex3 + offsetX ));
Color += weight[5] * (tex2D( SrcSamp, In.Tex5 )
+ tex2D( SrcSamp, In.Tex2 + offsetX ));
Color += weight[6] * (tex2D( SrcSamp, In.Tex6 )
+ tex2D( SrcSamp, In.Tex1 + offsetX ));
Color += weight[7] * (tex2D( SrcSamp, In.Tex7 )
+ tex2D( SrcSamp, In.Tex0 + offsetX ));
return Color;
}
// -------------------------------------------------------------
// Y뭉개기
// -------------------------------------------------------------
// -------------------------------------------------------------
// 정점셰이더
// -------------------------------------------------------------
VS_OUTPUT VS_pass2 (
float4 Pos : POSITION, // 모델정점
float4 Tex : TEXCOORD0 // 텍스처좌표
){
VS_OUTPUT Out = (VS_OUTPUT)0; // 출력데이터
// 위치좌표
Out.Pos = Pos;
Out.Tex0 = Tex + float2( 0.0f, - 1.0f/MAP_HEIGHT );
Out.Tex1 = Tex + float2( 0.0f, - 3.0f/MAP_HEIGHT );
Out.Tex2 = Tex + float2( 0.0f, - 5.0f/MAP_HEIGHT );
Out.Tex3 = Tex + float2( 0.0f, - 7.0f/MAP_HEIGHT );
Out.Tex4 = Tex + float2( 0.0f, - 9.0f/MAP_HEIGHT );
Out.Tex5 = Tex + float2( 0.0f, -11.0f/MAP_HEIGHT );
Out.Tex6 = Tex + float2( 0.0f, -13.0f/MAP_HEIGHT );
Out.Tex7 = Tex + float2( 0.0f, -15.0f/MAP_HEIGHT );
return Out;
}
// -------------------------------------------------------------
// 픽셀셰이더
// -------------------------------------------------------------
float4 PS_pass2(VS_OUTPUT In) : COLOR
{
float4 Color;
Color = weight[0] * (tex2D( SrcSamp, In.Tex0 )
+ tex2D( SrcSamp, In.Tex7 + offsetY ));
Color += weight[1] * (tex2D( SrcSamp, In.Tex1 )
+ tex2D( SrcSamp, In.Tex6 + offsetY ));
Color += weight[2] * (tex2D( SrcSamp, In.Tex2 )
+ tex2D( SrcSamp, In.Tex5 + offsetY ));
Color += weight[3] * (tex2D( SrcSamp, In.Tex3 )
+ tex2D( SrcSamp, In.Tex4 + offsetY ));
Color += weight[4] * (tex2D( SrcSamp, In.Tex4 )
+ tex2D( SrcSamp, In.Tex3 + offsetY ));
Color += weight[5] * (tex2D( SrcSamp, In.Tex5 )
+ tex2D( SrcSamp, In.Tex2 + offsetY ));
Color += weight[6] * (tex2D( SrcSamp, In.Tex6 )
+ tex2D( SrcSamp, In.Tex1 + offsetY ));
Color += weight[7] * (tex2D( SrcSamp, In.Tex7 )
+ tex2D( SrcSamp, In.Tex0 + offsetY ));
return Color;
}
// ------------------------------------------------------------
// 정점셰이더
// ------------------------------------------------------------
VS_OUTPUT VS (
float4 Pos : POSITION, // 모델정점
float4 Tex : TEXCOORD0 // 텍스처좌표
){
VS_OUTPUT Out = (VS_OUTPUT)0; // 출력데이터
// 위치좌표
Out.Pos = Pos;
Out.Tex0 = Tex + float2(3.0f/MAP_WIDTH, -3.0f/MAP_HEIGHT);
Out.Tex1 = Tex + float2(3.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT);
Out.Tex2 = Tex + float2(3.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
Out.Tex3 = Tex + float2(3.0f/MAP_WIDTH, +3.0f/MAP_HEIGHT);
Out.Tex4 = Tex + float2(1.0f/MAP_WIDTH, -3.0f/MAP_HEIGHT);
Out.Tex5 = Tex + float2(1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT);
Out.Tex6 = Tex + float2(1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
Out.Tex7 = Tex + float2(1.0f/MAP_WIDTH, +3.0f/MAP_HEIGHT);
return Out;
}
// ------------------------------------------------------------
// 픽셀셰이더
// ------------------------------------------------------------
float4 PS ( VS_OUTPUT In ) : COLOR0
{
float4 t0 = tex2D(SrcSamp, In.Tex0);
float4 t1 = tex2D(SrcSamp, In.Tex1);
float4 t2 = tex2D(SrcSamp, In.Tex2);
float4 t3 = tex2D(SrcSamp, In.Tex3);
float4 t4 = tex2D(SrcSamp, In.Tex4);
float4 t5 = tex2D(SrcSamp, In.Tex5);
float4 t6 = tex2D(SrcSamp, In.Tex6);
float4 t7 = tex2D(SrcSamp, In.Tex7);
float4 t8 = tex2D(SrcSamp, In.Tex0 + float2(-4.0f/MAP_WIDTH, 0));
float4 t9 = tex2D(SrcSamp, In.Tex1 + float2(-4.0f/MAP_WIDTH, 0));
float4 ta = tex2D(SrcSamp, In.Tex2 + float2(-4.0f/MAP_WIDTH, 0));
float4 tb = tex2D(SrcSamp, In.Tex3 + float2(-4.0f/MAP_WIDTH, 0));
float4 tc = tex2D(SrcSamp, In.Tex4 + float2(-4.0f/MAP_WIDTH, 0));
float4 td = tex2D(SrcSamp, In.Tex5 + float2(-4.0f/MAP_WIDTH, 0));
float4 te = tex2D(SrcSamp, In.Tex6 + float2(-4.0f/MAP_WIDTH, 0));
float4 tf = tex2D(SrcSamp, In.Tex7 + float2(-4.0f/MAP_WIDTH, 0));
return ((t0+t1+t2+t3)
+(t4+t5+t6+t7)
+(t8+t9+ta+tb)
+(tc+td+te+tf))/16;
}
// ------------------------------------------------------------
// 정점셰이더에서 픽셀셰이더로 넘기는 데이터
// ------------------------------------------------------------
struct VS_OUTPUT4
{
float4 Pos : POSITION;
float2 Tex0 : TEXCOORD0;
float2 Tex1 : TEXCOORD1;
float2 Tex2 : TEXCOORD2;
float2 Tex3 : TEXCOORD3;
};
// ------------------------------------------------------------
// 정점셰이더
// ------------------------------------------------------------
VS_OUTPUT4 VS4 (
float4 Pos : POSITION // 모델정점
,float4 Tex : TEXCOORD0 // 텍스처좌표
){
VS_OUTPUT4 Out = (VS_OUTPUT4)0; // 출력데이터
// 위치좌표
Out.Pos = Pos;
Out.Tex0 = Tex + float2(-1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT);
Out.Tex1 = Tex + float2(+1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT);
Out.Tex2 = Tex + float2(-1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
Out.Tex3 = Tex + float2(+1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
return Out;
}
// ------------------------------------------------------------
// 픽셀셰이더
// ------------------------------------------------------------
PixelShader PS4 = asm
{
ps_1_1
def c0, 0.5, 0.5, 0.5, 0.5
tex t0
tex t1
tex t2
tex t3
lrp r0, c0, t0, t1 ; r0 = (t0+t1)/2
lrp r1, c0, t2, t3 ; r1 = (t2+t3)/2
lrp r0, c0, r0, r1 ; out = (t0+t1+t2+t3)/4
};
// ------------------------------------------------------------
// 9콘 필터 샘플링
// ------------------------------------------------------------
VS_OUTPUT4 VS9 (
float4 Pos : POSITION // 모델정점
,float4 Tex : TEXCOORD0 // 텍스처좌표
){
VS_OUTPUT4 Out = (VS_OUTPUT4)0; // 출력데이터
// 위치좌표
Out.Pos = Pos;
Out.Tex0 = Tex + float2( 0.0f/MAP_WIDTH, 0.0f/MAP_HEIGHT);
Out.Tex1 = Tex + float2(+1.0f/MAP_WIDTH, 0.0f/MAP_HEIGHT);
Out.Tex2 = Tex + float2( 0.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
Out.Tex3 = Tex + float2(+1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT);
return Out;
}
// ------------------------------------------------------------
// 테크닉
// ------------------------------------------------------------
technique TShader4
{
pass P0// 16박스필터 샘플링
{
// 셰이더
VertexShader = compile vs_1_1 VS4();
PixelShader = <PS4>;
// 샘플러
Sampler[0] = (SrcSamp);
Sampler[1] = (SrcSamp);
Sampler[2] = (SrcSamp);
Sampler[3] = (SrcSamp);
}
pass P1// 9콘필터 샘플링
{
// 셰이더
VertexShader = compile vs_1_1 VS9();
PixelShader = <PS4>;
// 샘플러
Sampler[0] = (SrcSamp);
Sampler[1] = (SrcSamp);
Sampler[2] = (SrcSamp);
Sampler[3] = (SrcSamp);
}
}
// -------------------------------------------------------------
// 테크닉
// -------------------------------------------------------------
technique TShader
{
pass P0
{
// 셰이더
VertexShader = compile vs_1_1 VS_pass1();
PixelShader = compile ps_2_0 PS_pass1();
}
pass P1
{
// 셰이더
VertexShader = compile vs_1_1 VS_pass2();
PixelShader = compile ps_2_0 PS_pass2();
}
}
technique TShader16
{
pass P0
{
// 셰이더
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_2_0 PS();
}
}