๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Alphablend, Camera Effect

by eazuooz 2022. 10. 5.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/11cf6ef4d4dd6621872b0d64275c8755e3a9743a

 

Alphablend Camera Effect · eazuooz/WindowAPI@11cf6ef

Show file tree Showing 13 changed files with 143 additions and 50 deletions.

github.com

 

์ด์ „์—๋Š” ์บ๋ฆญํ„ฐ๋ฅผ TransparentBlt์œผ๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ RGB๋ฅผ ๋ฌดํšจ์ฒ˜๋ฆฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์บ๋ฆญํ„ฐ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ธ”๋ Œ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ผ๋‹จ ๊ธฐ์กด์— 24bit (RGB)๊ฐ€ ์•„๋‹Œ 32bit(RGBA)๊ฐ’์œผ๋กœ ์ €์žฅ๋œ ๋น„ํŠธ๋งต์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

A๋Š” ํˆฌ๋ช…๋„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

์•ŒํŒŒ๋ธ”๋ Œ๋”ฉ์ด๋ž‘ ์•ŒํŒŒ๊ฐ’์„ ์ด์šฉํ•ด

ํˆฌ๋ช…ํ•œ ๋ฌผ์ฒด๊ฐ€ ์žˆ์„๋•Œ๋Š” ๋’ค์— ๋ฌผ์ฒด ์ƒ‰์„ ๋”ํ•ด์ฃผ์–ด์„œ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋‘์ด๋ฏธ์ง€์ค‘ ํ•˜๋‚˜์˜ ํ”ฝ์…€๊ฐ’์„ ์ ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‘ ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€๊ฐ’์˜ ์ค‘์•™๊ฐ’์„ ์ตœ์ข… ํ”ฝ์…€๊ฐ’์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

		BLENDFUNCTION func = {};
		func.BlendOp = AC_SRC_OVER;
		func.BlendFlags = 0;
		func.AlphaFormat = AC_SRC_ALPHA;
		func.SourceConstantAlpha = 127;
		
		AlphaBlend(hdc, (int)vPos.x - mImage->GetWidth() / 2
			, (int)vPos.y - mImage->GetHeight() / 2
			, mImage->GetWidth(), mImage->GetHeight()
			, mImage->GetHdc(), 0, 0, mImage->GetWidth(), mImage->GetHeight(), func);
BlendOp                        :  ๋ธ”๋ Œ๋”ฉ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ DC์™€ ํ˜ผํ•ฉ ์—ฐ์‚ฐ์„ ํ•˜๋ ค๋ฉด
                                           AC_SRC_OVER ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 
                                           AC_SRC_ALPHA ๋Š” ์™„์ „ ์•ŒํŒŒ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.
BlendFlags                    :  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. 0์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
SourceConstantAlpha      :  ์•ŒํŒŒ ์ฑ„๋„๊ฐ’์ž…๋‹ˆ๋‹ค. 0~255์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 
                                           ( 0 : ์™„์ „ํˆฌ๋ช… ~ 255 : ์™„์ „๋ถˆํˆฌ๋ช… )
AlphaFormat                      :  ํฌ๋ฉง๊ฐ’์ž…๋‹ˆ๋‹ค. 0 ์ด๋‚˜ AC_SRC_ALPHA ์˜ต์…˜๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  AlphaBlend๋ผ๋Š” ํ•จ์ˆ˜์— ํ•ด๋‹น BLENDFUNC๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๊ณ  ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๋ฉด ํˆฌ๋ช…๊ฐ’์ด ๋ฐ˜์˜๋˜์–ด ์ด๋ฏธ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ํ•ด๋‹น ์•ŒํŒŒ๋ธ”๋ Œ๋“œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์นด๋ฉ”๋ผ ํŽ˜์ด๋“œ์ธ ์•„์›ƒ ํšจ๊ณผ๋ฅผ ํ•œ๋ฒˆ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

	class Object;
	class Image;
	class Camera
	{
	public:
		static void Initialize();
		static void Tick();
		static void Render(HDC hdc);

		static Vector2 CalulatePos(Vector2 pos) { return pos - mDistance; }
		static void SetTarget(Object* object) { mTarget = object; }

	private:
		Camera() = delete;
		~Camera() = delete;

	private:
		static Size mResolution;		// ํ™”๋ฉด ํ•ด์ƒ๋„
		static Vector2 mLookPosition;  // ์นด๋ฉ”๋ผ๊ฐ€ ๋ณด๊ณ ์žˆ๋Š” ์ขŒํ‘œ
		static Vector2 mDistance;		// ํ™”๋ฉด ํ•ด์ƒ๋„ ์ค‘์‹ฌ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์นด๋ฉ”๋ผ Look ๊ฐ„์˜ ์ฐจ์ด
		static Object* mTarget;
		
		static eCameraEffect mEffect;
		static Image* mCutton;
		static float mCuttonAlpha;
		static float mAlphaTime;
		static float mEndTime;
	};
	void Camera::Tick()
	{
		if(mTarget != nullptr)
			mLookPosition = mTarget->GetPos();

		// Alpha 1 -> 0, 5์ดˆ์— ๊ฑธ์ณ์„œ
		if (mAlphaTime <= 5.f)
		{
			mAlphaTime += Time::DeltaTime();
			float fRatio = (mAlphaTime / mEndTime);	// ์ œํ•œ ์‹œ๊ฐ„ ๋Œ€๋น„ ์ง„ํ–‰์‹œ๊ฐ„์˜ ๋น„์œจ์„ 0 ~ 1 ์‚ฌ์ด๋กœ ํ™˜์‚ฐ

			if (eCameraEffect::Fade_In == mEffect)
				mCuttonAlpha = 1.f - fRatio;
			else
				mCuttonAlpha = fRatio;
		}

		mDistance = mLookPosition - (mResolution / 2.0f);
	}
    
    	void Camera::Render(HDC hdc)
	{
		BLENDFUNCTION tFunc = {};
		tFunc.BlendOp = AC_SRC_OVER;
		tFunc.BlendFlags = 0;
		tFunc.AlphaFormat = 0;
		tFunc.SourceConstantAlpha = (BYTE)(255.f * mCuttonAlpha);

		AlphaBlend(hdc, 0, 0
			, mCutton->GetWidth(), mCutton->GetHeight()
			, mCutton->GetHdc()
			, 0, 0
			, mCutton->GetWidth(), mCutton->GetHeight()
			, tFunc);
	}

 

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Animator  (1) 2022.10.13
Object Delete  (0) 2022.10.12
Camera  (1) 2022.10.04
Collider Manager  (1) 2022.09.30
Collider  (0) 2022.09.27

๋Œ“๊ธ€