2020 이전/DirectX

HLSL 셰이더: paper burn, mask, distortion

이상해C++ 2019. 3. 4. 14:44



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