Log Stash

as an Industrial Personnel

프로그래밍/삽질

예전의 뻘짓 - 셰이더로 엑스레이 효과 간단 흉내

SavvyTuna 2013. 11. 9. 23:38


모종의 이유로 작업폴더를 뒤지다 보면 옛날에 만들어 놓자마자 하드에 쳐박아 두느라 만들었는지도 몰랐던 것들을 발견하게 된다.


요즘 픽셀셰이더를 가지고 잠깐 테스트 할 게 있어서 고1때 평소에 셰이더 만지면서 놀기위해 미리 셋업 해 놓았던 프로젝트를 몇 년만에 켜 봤는데, 고1 겨울방학때 Photo Booth의 엑스레이 효과를 구현하겠다고 설쳐댔던게 나름 그럭저럭 되어 있었다.


아예 아무것도 못 하고 접은줄 알았는데.




셰이더로 만든 효과.


맥북에서 포토부스 앱으로 찍은 사진.



여기에서 이제 색감 좀 조정해 주고, 대비 높여주고, 약간 뽀샤시(?) 한 효과를 넣는다던가 해서 보정하면, 꽤나 비슷하게 만들어지지 않을까 싶다.


아래는 픽셀세이더 함수. 별거 없긴한데, 아직 저 mat이 뭔지 잘 기억이 안 난다. 분명히 열심히 종이에다가 적었던 기억은 있는데... 뭐 강좌가 아니니 그냥 넘어가자. 아마 저 시퍼런 색깔을 입히는 역할일지도?


float4 PS(VS_OUTPUT In) : COLOR
{   
	float4 Out = (float4)0;
	float3 color1 = tex2D(SourceSamp, In.Tex0); // 텍스쳐 색상
	
	float3 color2 = {0.29f,0.587f,0.114f}; // YUV 변환 공식

	float3x3 mat = {
		{1.0f,0.0f,1.4f},
		{1.0f,-0.3f,-0.7f},
		{1.0f,1.7f,0.0f},
	};

	float3 yuv = (float3)0;

	// RGB로 이루어진 color1 을 YUV로 변환
	yuv.x= dot(color1,color2)-0.125;
	yuv.y= -0.02f;
	yuv.z= 0.1f;
	
	// 행렬곱
	Out.rgb = mul(mat,yuv);

	// 반전
	Out.x = 1 - Out.x;
	Out.y = 1 - Out.y;
	Out.z = 1 - Out.z;

    return Out;
}