전체 글 118

Texture, Render Target 그리고 Surface란?

렌더 타겟(Render Target) - 말 그대로 Device가 렌더링을 수행할 타겟이 되는 텍스쳐이다. 이미 우리가 알고 있듯이 DirectX에선 Resource를 파이프라인에 직접 바인딩하는 것이 아니라, 그 Resource의 View를 바인딩 해야 한다. 예를 들어, 화면에 무언가 그려내기 위해서는 백버퍼에 그려야 하는데 이 의미는 백버퍼가 렌더 타겟이 된다는 의미이고, 렌더 타겟에 무언가 그리려면 백버퍼에 대한 Render Target View를 Output Merger단계에 바인딩 해야 한다. 백버퍼가 렌더 타겟이 되는 경우가 흔히 아는 경우지만 렌더 타겟을 백버퍼가 아니라 (사용자가 지정한)텍스쳐로 할 수도 있는데, 이때는 렌더링을 텍스쳐의 Surface에 해야 한다. GetBuffer로 백..

[포트폴리오 구조] AlphaBlend 적용 방법

SpriteComponent이던, StaticMeshComponent이던 Material을 갖고 있다. Material은 멤버로 아래와 같은 녀석들을 갖고 있다. CSharedPtr m_Shader; std::vector m_TextureInfo; Vector4 m_BaseColor; float m_Opacity; class CMaterialConstantBuffer* m_CBuffer; CSharedPtr m_RenderStateArray[(int)RenderState_Type::Max]; enum class RenderState_Type { Blend, Rasterizer, DepthStencil, Max }; 여기서 m_RenderStateArray에 RenderState_Type::Blend에 미..

[포트폴리오 구조] ResourceManager, SceneResource 그리고 각종 Manager들의 관계

1. SceneResource는 특정 Scene에만 존재하는 Resource들을 Scene마다 개별적으로 관리하게 위해 존재하는 녀석 2. 기본적으로 SceneResource에 있는건 모두 ResourceManager에도 있다 3. ResourceManager는 여러개의 매니저들(MeshManager, ShaderManager, MaterialManager, TextureManager, AnimationManager)들을 관리하고, 해당 리소스에 대한 요청을하면 ResourceManager는 해당 매니저에게 똑같은 이름의 함수를 중간에서 호출해주고 결과를 받을 뿐이다. 실질적인 동작은 각각의 매니저들이 해준다. 예를 들어서 SceneResource::LoadSequence2D를 호출하면 SceneReso..

인코딩 변환 함수(MultiByteToWideChar(), WideCharToMultiByte())

출처에 표시해놓은 블로그에서 유니코드멀티바이트 변환 함수를 잘 정리해놓아서 출처를 밝히고 여기 옮긴다. MultiByteToWideChar()함수와 WideCharToMuliByte()함수를 사용해서 인코딩을 변환해 주는 것도 가능합니다. 이 두함수는 윈도우에서만 지원합니다. 따라서 OS 디펜던시가 없는 라이브러라 같은 것을 개발하신다면 이 두함수는 사용하실 수 없긴 하지만 많은 윈도우 개발자들이 사랑하는 함수죠. 먼저 MBCS를 UTF-16으로 바꾸는 함수입니다. int MultiByteToWideChar( UINT CodePage, // 원본 스트링의 현재 인코딩 상태 DWORD dwFlags, // 0을 쓰면 된다. LPCSTR lpMultiByteStr, // 변환하려는 문자열 int cbMult..

공부/WINAPI 2021.12.10

Visual Studio 문자 집합 사용(유니코드, 멀티바이트)

다른게 없고 그냥 전처리기에서 유니코드 관련 매크로(ex. TEXT, TCHAR 등)을 사용했을때 멀티바이트 문자열(char로 선언된 문자열)을 유니코드 문자열(wchar로 선언된 문자열)로 변환해줄건지, 그대로 리턴할건지에 정해줄 뿐이다. 문자 집합을 유니코드 문자 집합 사용을 쓰던, 멀티바이트 문자 집합을 사용을 쓰던, char는 멀티바이트를 담는 타입, wchar는 유니코드를 담는 타입이라는 사실은 변함 없다.

공부/그 외 2021.12.08

DirectX의 더블 버퍼링

WinAPI에서도 화면에 게임의 장면을 그려내기 위해서 매 프레임마다 화면에 출력을 해줄때 화면이 깜빡거리는 현상이 있었다. 그때는 BitBlt를 이용해서 따로 만들어둔 버퍼에 게임 장면을 다 그리고 화면으로 매 프레임마다 고속 복사 해주는 방식으로 해결했다. DirectX에서는 다르지만 조금 더 효율적인 방법인 '더블 버퍼링(Double Buffering)'이라는 기법으로 깜빡거리는 현상을 해결한다. 위의 사진에서 볼 수 있듯이, 전면버퍼(Front Buffer)와 후면버퍼(Back Buffer) 두개의 버퍼를 둔다. 전면버퍼를 화면에 출력되는 버퍼이고 후면 버퍼는 다음 프레임에 출력될 장면을 그려주는 버퍼이다. 후면버퍼에 다음 프레임 장면을 그려주고 그 장면을 출력할 차례가 되면 후면버퍼였던 버퍼가 ..

안티 앨리어싱(Anti-Aliasing), 멀티 샘플링(Multi-Sampling), 알파 포괄도 변환(Alpha-To-Coverage)

알파 포괄도 변환(Alpha-To-Coverage) BlendState를 만들려고 CreateBlendState를 호출하려고 하면 D3D11_BLEND_DESC를 채워주고 인자로 그 주소값을 넣어줘야 하는데, Description에 보면 AlphaToCoverageEnable라는 멤버가 있다. AlphaToCoverageEnable에 대한 설명을 읽어보자 내가 이해한 것을 쉽게 정리하자면 한 픽셀에서 그 도형에서 차지하는 비율과 알파를 곱한 것이다. 예를 들어서 어떤 한 픽셀의 면적의 0.3만큼 어떤 도형이 차지하고, 그 픽셀 알파값이 0.5면 0.3 * 0.5 = 0.15로 그 픽셀의 알파값을 정하는 것이다. 이렇게 하면 경계선이 약간 blur처리된 것 처럼 보여서 계단 현상이 완화될 수도 있을 것 같..

DirectX 용어 정리

DirectX 수업을 들으면서 개인적으로 헷갈리거나 추상적으로 느껴지는 용어들을 정리해두려고 한다 * 검색해가면서 공부한 정보들을 모은거라 틀린 부분이 있을 수 있습니다 * 엔진 - 게임 제작에 필요한 라이브러리를 모아놓은 것 드라이버 - 렌더링에 필요한 GPU에게 명령을 내릴 수 있게 만든 객체 SDK(Sofeware Development Kit) - 개발자들이 개발하는데 사용하는 도구. 컴파일러, 디버거, 문서, 라이브러리, API 등이 포함될 수 있다 뷰포트 - 간단하게 말하면 윈도우에 보여질 영역을 의미한다. DirectX에서는 뷰포트에 화면을 출력하고, 뷰포트를 윈도우 클라이언트 영역에 맞춰서 윈도우에 보여질 수 있게 한다고 한다 페이지 플리핑 - 백버퍼와 화면 버퍼를 스왑해주는 기법. 예를 들..

const 멤버 함수의 리턴 타입을 레퍼런스로 할 수 없는 이유/ const 멤버함수 내부에서 const가 아닌 멤버 함수를 호출할 수 없다

위의 GetBar 함수같은 표현은 허용되지 않는다. 그 이유는 stackoverflow에서 쉽게 찾을 수 있다. 요약하자면 레퍼런스를 리턴하면 클래스의 내부 상태(여기선 Bar 멤버 변수)를 바꾸지 않는 다는 것(const)을 보장할 수 없기 때문이다. 따라서 const를 빼던가 레퍼런스(&)를 리턴 타입에서 빼줘야 한다 여담이지만 const 멤버 함수 내부에서는 const 멤버 함수가 아닌 다른 함수를 호출할 수 없다. Reference https://stackoverflow.com/questions/4957025/const-methods-that-return-references/4957167 Const Methods that Return References class Foo { int Bar; pub..

공부/C || C++ 2021.11.12