R채널에는 포토샵으로 생성한 구름 텍스쳐, 그리고 G채널에는 마스킹에 쓸 텍스쳐를 넣었다.
1. paper burn 셰이더
셰이더 코드로 누적시간값에 사인을 연산한 값을 넘겨줘(g_vMtrlDif.a 에 넘겨주었다) 필터의 값으로 썼다.
해당 텍스처의 r값이 g_vMtrlDif.a의 값보다 작으면 해당 텍스처를 출력하지 않는다.
g_vMtrlDif.a값을 증가시키면 1이될때 어떤 텍스처도 출력되지 않을 것이다.
이러면 심심하니까 좀더 불에 타는듯이 하려면 테두리가 있어야하는 것을 알 수 있다
필터 크기에 간격을 두어 빨강-노랑-흰색을 출력하도록 한다. 내새꾸는 메인컬러는 빨강이므로 (1,0,0,1)로 간다.
PS_OUTPUT_SINGLE FX_PaperBurn(VS_OUTPUT_TEX input)
{
PS_OUTPUT_SINGLE output = (PS_OUTPUT_SINGLE)0;
//g_EffectTex1
float4 vColor = (float4)0.f;
if (g_iAnimation2DEnable == 0)
{
vColor = g_DiffuseTex.Sample(g_PointSmp, input.vUV);
}
else
{
if (g_iAnim2DType == AT_ATLAS)
vColor = g_DiffuseTex.Sample(g_PointSmp, input.vUV);
else
vColor = g_ArrayTex.Sample(g_PointSmp, float3(input.vUV, g_iAnim2DFrame));
}
float4 vFX_tex = g_EffectTex1.Sample(g_LinearSmp, input.vUV);
if (vColor.a == 0.f)
clip(-1);
if (vFX_tex.r >= g_vMtrlDif.a)
vColor.a = 1;
else
vColor.a = 0;
if (vFX_tex.r >= g_vMtrlDif.a - 0.05 && vFX_tex.r <= g_vMtrlDif.a + 0.05)
vColor = float4(1, 0, 0, 1); // 빨
else
;
if (vFX_tex.r >= g_vMtrlDif.a - 0.03 && vFX_tex.r <= g_vMtrlDif.a + 0.03)
vColor = float4(1, 1, 0, 1); // 노
else
;
if (vFX_tex.r >= g_vMtrlDif.a - 0.025 && vFX_tex.r <= g_vMtrlDif.a + 0.025)
vColor = float4(1, 1, 1, 1); // 흰
else
;
output.vColor = vColor;
return output;
}
2. 마스킹 셰이더
녹색채널을 이용하여 G채널에 있는 부분만 마스킹하는 셰이더.
색상의 a채널이 텍스처의 녹색채널 값이 되면 된다.
PS_OUTPUT_SINGLE FX_Mask(VS_OUTPUT_TEX input)
{
PS_OUTPUT_SINGLE output = (PS_OUTPUT_SINGLE)0;
float4 vFX_tex = g_EffectTex1.Sample(g_LinearSmp, input.vUV);
float4 vColor = (float4)0.f;
if (g_iAnimation2DEnable == 0)
{
vColor = g_DiffuseTex.Sample(g_PointSmp, input.vUV);
}
else
{
if (g_iAnim2DType == AT_ATLAS)
vColor = g_DiffuseTex.Sample(g_PointSmp, input.vUV);
else
vColor = g_ArrayTex.Sample(g_PointSmp, float3(input.vUV, g_iAnim2DFrame));
}
vColor.a = vFX_tex.g;
output.vColor = vColor;
return output;
}
3. Distortion 셰이더
현재 메인텍스처로 이용하고 있는 것은 g_DiffuseTex이기 때문에위에서 썼던 추가 텍스처의 R채널을 가중치로 사용하여 UV 값에 더하면 왜곡 효과를 낼 수 있다.
가중치 0.1/가중치 0.5
PS_OUTPUT_SINGLE FX_Distortion(VS_OUTPUT_TEX input)
{
PS_OUTPUT_SINGLE output = (PS_OUTPUT_SINGLE)0;
float4 vFX_tex = g_EffectTex1.Sample(g_LinearSmp, input.vUV);
float4 vColor = (float4)0.f;
float fWeight = vFX_tex.r * 0.5f;
if (g_iAnimation2DEnable == 0)
{
vColor = g_DiffuseTex.Sample(g_LinearSmp, input.vUV + fWeight);
}
else
{
if (g_iAnim2DType == AT_ATLAS)
vColor = g_DiffuseTex.Sample(g_LinearSmp, input.vUV + fWeight);
else
vColor = g_ArrayTex.Sample(g_LinearSmp,float3(input.vUV + fWeight, g_iAnim2DFrame));
}
output.vColor = vColor;
return output;
}
'2020 이전 > DirectX' 카테고리의 다른 글
스텐실 버퍼를 이용한 라이트 볼륨 디퍼드 렌더링 (0) | 2019.06.05 |
---|---|
다이렉트X 2D게임 모작 (0) | 2019.04.23 |
상수버퍼 패딩 (0) | 2019.02.07 |
DirectX input 시스템 (0) | 2019.01.22 |
DirectX 11 렌더링 파이프라인 (0) | 2019.01.09 |