포트폴리오 만들기

17.AddTCHAR/Renderer 추상클래스/Entity Class 위치 변경/Resource/SmartPointer구현/Convert WC2C,C2WC

Roka_is_back 2024. 1. 22.

1.AddTCHAR

mystring 을 짜서 raii 하게 동작하도록 해도 되지만 간단하게 스마트 포인터로 사용할 수 있도록 했다.

rokaSTL_Lib - func.cpp

 

2.Renderer 추상 클래스 만들기.

물론 나는 여러 버전을 구현할건 아니지만 예를들어 dx 의 경우에도 추상클래스를 제공하면 그래픽 카드 회사들이 
내용을 구현하는걸로 알고 있다.

이렇게 하는게 모듈성,확장성이 좋고 유지 관리에 용이한 것 같다.
(외부에서 호출하는 함수는 어차피 똑같고 내부 수정만 일어난거라 외부 사용자는 모른다.)

 

예를들어 지금 아래와 같이 되어있는데,

1)InitDevice와 Render는 외부에서 필요하지만 Create 들은 외부에서 알 필요가 없다.

2)CDxDevice 라는 이름이 아니라 Device 라는 이름을 사용하는 추상클래스여야 한다.

3)InnerDevice를 DxDevice로 바꿔야 한다.

 

Engine 의 경우에는 Engine 끼리의 호환성이 보통 있진 않으니 안해도 될 것 같다.

(언리얼 유니티만 봐도 함수명 다른 것  투성이고 ..)

기존 코드

기존 코드의 경우 DxDevice와 InnerDevice는 상속구조가 아니고 소유의 개념이었다.

추상클래스로 변경하면서 이름도 바꾸고 상속구조로 바꾸었다.

바꾼 내용은 아래를 보자.

 

바뀌는 예시 예제.(오류 없을지 테스트 해봄)

 

왼 : 바뀐 구조 오: Renderer - External.cpp

 

 

3.Engine 에 있던 Entity class RokaSTL_Lib 로 옮김.

Renderer.dll, Engine.dll, Script.dll , RokaProj 모두 사용 가능할 수 있도록 옮겼다.

이름정보,ID정보 만 들고 있기 때문.

 

이렇게 하면 안될 것 같다.

왜냐하면 lib의 static 변수는 dll들이 공유하지 못할 것 같음.

하지만 그렇다고 Renderer에 Engine을 링크할 수 없다.

그렇게 되면 RokaProj 에서 Engine이 먼저 Load되어야 Render Load가 가능해지는데,

이미 Engine은 Renderer를 링크해놔서 Engine 또한 Render 가 먼저 Load되어야 하는 상황이 되어

서로 Load되지 않을것임.

링크가 위와 같이 되어 있음.

그래서 Renderer.dll 에 CEntity 를 두면 될 것이라 생각한다.

Renderer 로 이동.

 

잘 출력된다.

4.Resource , ResourceManager

  - Resource : Mesh,Material,Shader,Texture (Texture는 나중에)

  - Resource Manager

Resource와 Manager 어디서 구현하는게 좋을까?

Resource

Renderer에서 구현하려고 한다.

일단 이유 첫번째는 Dx 정보들을 들고 있어야 하기 때문이다.(Renderer.dll만 Dx 명령어를 알고 있음.)

두번째 이유는 GameObject에서는 필요한 Resource들은 RenderComponent가 참조할 것이기 때문에 Engine과 Renderer가 무리없이 코드를 수행할 수 있을 것이라 생각함.

Resource manager

Engine에 구현하려고 한다.

Manager에서는 리소스에 대한 참조 정보를 들고 있는 것이기 때문이다.

 

엔진에 필요한 Resource 의 초기화

Engine에 구현하려고 한다.

Renderer의 해당 Resource가 공개한 함수를 토대로 정보를 설정하면 될 것 같다.

 

구조 생각하기

구조 uml

어느 class에 어떤 멤버변수를 배치 시키고, Init과 render 함수를 분리하는 작업을 했다.

(기존 코드는 튜토리얼 코드를 보며 분리없이 render에서 초기화 + render를 모두 수행함)

Resource

Renderer.dll - Resource.h

1. 리소스 내부에서 참조 카운팅을 하도록 했다.(다음 항목에 스마트 포인터 구현과 관련 있음.)

2. 자신의 리소스 타입을 저장한다.

Mesh

Renderer.dll - Mesh.h

Create로 Mesh를 만들 수 있다.

t_VertexData 정보를 담고 있는 std::vector 와 Index 정보를 담고있는 std::vector를 넘겨준다. 

Renderer.dll - Mesh.cpp

Shader

Renderer.dll - GraphicsShader.h

Resource를 상속받는 Shader를 상속받는다. 

이렇게 한 이유는 나중에 Compute Shader와 분리해주기 위해서 이다.

 

CreateVertexShader

1) Shader 정보를 가지고 Compile 해준다.

2) Compile로 나온 Blob(코드 정보) 를 가지고 VertexShader를 만들어준다.

3) IA 단계에 등록되어야 하는 정보 t_VertexData에 대한 Desc를 작성한다.

struct.h

4) LayOut 을 생성한다.

LayOut 정보는 아래의 VS_IN이다.

 

std3d.fx

CreatePixelShader

 

Render

Render해야할 때 자신의 정보를 렌더링 파이프 라인에 올리도록 한다.

 

5.Resource 용 Smart Pointer 구현

operator->() 구현시 주의점

호출한 자신을 리턴하면 안된다.

예시

A:: operator->(){return b;}

//이렇게 있다고 하면

A objA;

objA->Print();//변환 과정(1)

objA.operator->().->Print();//변환 과정(2)

b->Print();//변환 과정(3)

 

참고

https://blog.naver.com/herbbread/221302089225

 

c++ operator->() 를 오버로딩할 때 일어나는 현상 및 주의점

1. operator->() 를 오버로딩하고 화살표 연산자(arrow operator)에 의해 operator->() 가 호출...

blog.naver.com

구현

renderer.dll - sptr.h

 

 

6. Convert WC2C , C2WC

RoksSTL_Lib.lib - func.cpp

 

 

끝.

 

아직 만든 코드를 다 완성하지 못해서 테스트는 못해봄.

 

내일 할 일

1.Device init에서 Mesh 생성,Shader 생성.

2.생성한 Mesh와 Shader로 출력.

3.잘 출력됨을 확인하면 ResourceManager 구현.

 

 

댓글