d3dx9 - 21.10.12

김주현·2021년 10월 12일
0

d3dx9 3D

목록 보기
4/30

렌더 비긴과 : 렌더링하기위한 준비작업

비긴과 엔드 사이 : (백퍼버에) 객체들을 그린다. (당장화면에 보이지는 않음)

렌더 엔드 : 렌더링의 마무리.(실제 보여주는 동작)
(백버퍼를) 뷰포트(윈도우에) 출력에 해준다. (Present)함수

렌디 비긴안 장치객체의 Clear함수 : 시멘틱에 해당하는것들을 지워줌
Target - 백버퍼
API때는 백버퍼에 계속 중첩하여 그린다.
DirectX : 항상 그리기 직전에 백버퍼에 그려져있던 픽셀정보를 모두 초기화한다.

Z버퍼와 스텐실버퍼 : 3D에서 그려지는 형태를 결정하는 버퍼(추후 설명)
그뒤 인자세개는 각각 백버퍼,z버퍼,스텐실버퍼를 초기화하는값
ARGB(투명한정도,R,G,B) D3DXCOLOR(R,G,B,A)

만약 (255,255,255,255) 검은색을 지우게 된다면 이미지로부터 색깔을 받아오고 빛으로 부터영향을 받는 색깔을 표현할때 빛을 안받는 부분은 검은색으로 설정
이때 빛설정이 잘못되면 빛을 안받을때 모두 검은색으로 표현될수있음
그렇기 때문에 흰색과 검은색은 잘사용하지않음

스프라이트 객체의 비긴과 엔드 2D에서만 사용하는 기능 3D에서는 안해도됨

다렉에서는 사각형을 바로 그릴수없음 먼저 점 4개를 찍고 삼각형을 두개 그려낸후 로드 해놓은 텍스쳐를 그위에다 올림.

d2d 에서는 스프라이트를 사용할때 - 자동으로 사각형을 만들어주고있었음
but 2D에서 그려주는건 편하지만 한게가 명확함
스프라이트는 오로지 2D렌더를 위해서만 필요 3D는 그려줄수없음

  1. 그래픽 디바이스::Free() 에서 조건문을 Safe_Release함수로 변경해줌

  2. crtdbg메모리 누수를 탐지하는 라이브러리

EngineDefine에 crtdbg를 위한 코드 추가

진입접함수(wWinMain)에 CrtSetDbgFlag 추가

이제 프로그램을 껏다 키면 메모리 누수를 찾아줌

릭체커는 내가 직접 new한것에만 대해서 릭체크를 할수있음(ex D3DXCreateLine같은 함수로 만들어준것은 탐지하지못함 (컴객체))

그래서 메시지 박스를 통해 릭이 나는것을 알려준것

  1. 현재 게임인스턴스의 Free함수를 호출하지 못하는 상태

게임인스턴스의 0인 상태 ->한번더 세이프 릴리즈를 호출해서 지워줘야함

클래스와 객체의 차이

클래스(Class) 란

개념
객체를 만들어 내기 위한 설계도 혹은 틀
연관되어 있는 변수와 메서드의 집합


객체(Object) 란

개념
소프트웨어 세계에 구현할 대상
클래스에 선언된 모양 그대로 생성된 실체

특징
‘클래스의 인스턴스(instance)’ 라고도 부른다.
객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
oop의 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부른다.

https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html

정적 멤버 함수 - http://tcpschool.com/cpp/cpp_encapsulation_staticConst

현재 게임인스턴스 객체의 주소는 싱글톤 m_pInstance안에 객체화되어있음

GameInstance 안에 Engine_Release 함수 추가 -> Get_Instance()->Destroy_Instance()를통해 객체를 지워줌

여기서 지금까지 Destrot_instnace는 객체가있다면 무조건 지워줬지만 이제 레퍼런스 카운트를 통해 삭제를 해줘야함

dwRefCnt = Safe_Release(m_pInstance)를 통해 지워주고 값을 반환해주자

다음 Release_Engine()으로 돌아와서 Destroy_Instance()함수를 호출한후 결과값을 조건문으로 걸어서 삭제하지못했다면 메시지박스 출력

MainAPP에 Free에서 릴리스 엔진을 호출해줌
객체를 통해 호출하면 지워지는객체가 함수를 호출하는것이 모호해짐
엔진에서 바로 전역함수 호출하듯이 호출하자.

Release_Engine 을 스태틱 함수로 만들어줌

게임인스턴스의 생성자에서 그래픽디바이스를 객체화했음.

그래픽 디바이스 멤버변수에 싱글톤의 주소를 대입해놨음

게임끝날떄 릴리스엔진이 호출될거고 최종 메모리 해제를 수행하게 될것이다.

참조자를 먼저 지우고 원본을지워야함

게임인스턴스를 지운다 -> 그래픽디바이스의 레퍼런스카운트를 0으로만들어줌 -> 그래픽 디바이스를 지워줌

이순서를 맞춰줘야함

  1. 오브젝트매니저도 엔진쪽에 싱글톤으로 만들어줘야함 (반드시 릴리즈 엔진에서 지워줘야함)

  2. 로딩화면을 만들어주는 작업

레벨 : 이전의 씬의 역할

각 로고,로딩,스테이지 레벨의 공통되는 부분을 부모 클래스로 만들자

그리고 이런 기능들은 모든 클라를 포함한 모든 프로젝트에 사용될수있음 -> 엔진에 구현하자

부모클래스에 공통된으로 사용된 기능을 구현해주고 엔진에 구현

클라에서 부모클래스를 상속받아 세부적인 씬을 구현한다.

클라에 레벨 필터 추가 -> CLevel_Logo 클래스 추가

  1. 엔진에 씬 부모 클래스 구현

엔진의 유틸리티 필터 에 레벨 필터 에 CLevel 클래스 구현

CBase를 상속받아야함

클라에서 상속받아 부모의 멤버변수와 함수를 사용할것이기 때문에 라이브러리를통해 외부로 보내야함

CLevel생성자에서 장치객체를 인자로받음(자주 사용하기때문에 필요할때마다 Get_Instance로 받는거보단 인자로 받는게 좋음)

생성자와 소멸자 구현해주고 CBase의 순수가상함수 Free 구현

NativeConstruct() , Tick(_double TimeDelta), Render() 선언

생성자에서 이니셜라이져로 m_p그래픽디바이스에 받아온 인자 넣어줌 -> 그래픽디바이스 Add_ref그리고 Free에서 Release해주자

  1. 클라의 레벨 로고 구현

레벨 로그 헤더에서
Level.h 와 Client_Defines.h 추가

CLevel을 상속받아줌

부모클래스는 장치를 인자로받아 생성 -> 자식도 생성자로 장치를 받아와줘야함 -> 이니셜라이저에서 부모를 생성할떄 장치를 인자로 넘겨줘야하기 때문

NativeConstruct,Tick,Render,Free에서 일단 __super로 부모의 함수를 호출해주자

지금뜨는 경고창은 디버그모드에서만 메모리릭잡는 라이브러리때문에 뜸

어느시점에서도 레벨을 교체할수있는 레벨 매니저를 만들어주자

  1. 엔진 레벨 매니저 추가

Base.h 추가

CLevel_Manager는 게임 인스턴스를 통해 보여줄것이기떄문에 외부로 내보내지 않아도됨

DECLARE_SINGLETON 추가

멤버변수로 m_pCurrentLevel 추가

그리고 멤버변수에 값을 채워주기위한 SetUp_Level(CLevl* pLevel) 추가

열거체 LEVEL 로 사용할 레벨의 형태를 모두 정의

이때 열거체를 SetUp의 인자로 넘겨준다면 내부에서 할당이진행되면 엔진이 클라의 헤더를 추가해줘여함 -> 의미가없어짐

이미 할당된 레벨을 넘겨받자

m_pCurrentLevelsms Free에서 Safe_Release해줌

왜 동적할당한 객체를 받아서 커렌트레벨에 넣어줬는데 참조수를 1증가시켜주지않는가?

레벨매니저는 레벨을 담기위해 만들어준거니깐 (싱글톤에서도 동적할당시 카운트늘려주지않았음)

  1. 게임인스턴스에 레벨매니저 추가

레벨매니저 헤더 추가

멤버변수로 레벨매니저 포인터 추가

생성자에서 이니셜라이저로 초기화

Free에서 레벨 매니저 릴리즈

릴리즈 엔진에서 레벨매니저 릴리즈

게임인스턴에 레벨매니저 리전 추가
레벨매니저 멤버함수 추가 Set_UpLevel() 구현

  1. 씬을 할당

MainApp에서

SetUo_Level()을 호출

레벨로고에서 Create함수 구현

0개의 댓글

관련 채용 정보