분류 전체보기 56

[C++] Smart Pointer

https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 | Rookiss - 인프런Rookiss | , MMORPG 개발에 필요한 모든 기술, C++ & Unreal로 Step By Step! 🕹️ 기초부터 끝판왕까지, MMORPG 개발하기 🎮 [사진] 포트폴리오 완성을 목표로 하는 게임 프로그래머 취업 준비생, C++과www.inflearn.com 참고 강의1. 개요오늘은 C++의 스마트 포인터에 대해 알아보도록 합시다. 그전에 스마트 포인터는 왜 써야하는 것일까요? 그것은 바로 일반 포인터의 문제점들 때문입..

C++ 2025.04.26

[Effective C++] 항목 13: 자원 관리에는 객체가 그만!

1. 개요이번 장은 자원을 관리하는 법에 대해서 기술하는 챕터이다. 특히 항목 13은 포인터를 사용한뒤 해제하는 방법들을 소개한다. void f(){ Investment *pInv = createInvestment(); // 무언가 동작 delete pInv;} 이러한 코드를 보면 정상적으로 작동한다고 보일 수 있다. 그러나 중간에 있는 주석부분에 다양한 로직이 들어갈 수 있고 그때에 문제가 발생할 가능성이 있다. 2. 문제점과 auto_ptr저 코드가 정상적으로 delete까지 도달하면 아무런 문제가 없겠지만 그럴것이라는 보장이 절대 없다. 만약 중간에 다른 로직이 추가되어서 delete에 도달하기 전 return을 한다면 memory leak이 발생하게 된다. 혹은 예외등이 발생해..

[Effective C++] 항목 12: 객체의 모든 부분을 빠짐없이 복사하자

1. 개요설계가 잘 된 클래스를 보면 객체를 복사하는 함수는 딱 2개 있습니다. 1. 복사 생성자2. 복사 대입 연산자 우리는 이 둘을 통틀어서 복사 함수라고 부릅니다. 우리는 컴파일러가 자동으로 생성해주는 복사 함수 이외에 개발자가 따로 선언하는 것도 가능합니다. 그러나 컴파일러는 우리가 복사 함수를 잘못 선언해도 알려주지 않습니다. 그 예시를 한번 보도록 하죠 2. 복사 함수에 문제가 생길 때void logCall(const std::string& funcName); // make a log entryclass Customer {public: Customer(const Customer& rhs); Customer& operator=(const Customer& rhs);private: ..

[후기] 학교에서 코딩 클래스 열었던 이야기

저는 예전부터 누군가에게 무언가를 알려주거나 말하는 것을 즐기는 사람이었습니다. 한때 교사의 꿈을 가졌지만 여러가지 이유로 현재는 컴퓨터공학을 전공하게 됐고, 그중에서도 게임개발을 하게 되었습니다. 4학년 2학기에 퇴사하고 마지막 학기를 보내고 있던 중에 코딩관련 교육과 관련한 일을 하고싶은 작은 꿈이 있었습니다. 그래서 학교를 졸업하기전 제가 가진 지식으로 코딩 초보자들에게 게임개발을 알려주는 클래스를 개설해서 운영해보고 싶다는 생각을 하게 되었습니다. 그 즉시 홍보용 포스터, 커리큘럼, 글을 작성하기 시작했습니다. 아래는 학교 everytime에 올렸던 홍보글입니다. 처음에는 무료로 할까도 생각했지만 어느정도 의지가 있고 끝까지 강의 완주를 하실분들이 필요했기에 최소한의 금액을 걸어두었습니다. (수업..

후기 2025.04.24

[DX11] PCF (Percentage Closer Filtering)

1. 개요우리가 지난번 만들었던 그림자에는 한가지 문제점이 있습니다.https://yeoul0714.tistory.com/37 [DX11] Point Light Shadow - Peter Panning, Shadow Acne1. 개요게임 세상에서 그림자를 띄울 수 있다면 보다 더 실감나는 게임이 될것입니다. 오늘 알아볼내용은 바로 그림자를 구현하는 방법입니다. 우선 그림자를 구현하기 위해서는 Depth값이 필요yeoul0714.tistory.com 그것은 바로 테두리가 울퉁불퉁 하다는 것입니다. (Aliasing) 이런식으로 그림자가 생긴곳을 가까이서 보도록 합시다. 이렇듯 그림자의 테두리가 울퉁불퉁하고 날카로운것을 볼 수 있습니다. 이러한 문제가 생기는 이유는 스태틱 메시의 depth를 담고있는 ..

DirectX11 2025.04.24

[DX11] Renderdoc 사용법 CubeMap 디버깅

1. 개요지난 Shadow글에서는 구현이 완료된 뒤에 내용을 정리한 글이기 때문에 막힘없이 쭉쭉 나아갔던것을 볼 수 있었습니다. 그러나 실제로 구현을 할때는 마치 끝이 보이는 어두컴컴한 터널을 걷는 기분이었습니다. 이 길이 맞는지도 모르고 끝까지 간다고 해서 출구가 있을지도 모르는 미지의 상황이었습니다. 코딩은 마치 우리의 인생과 참 많이 닮아 있습니다. 이 길이 맞는지는 아무도 모르고 끝까지 간다고 해서 원하는 결과를 낼 수 있을지도 모릅니다. 결국 해결할 수 있었던것은 동료들과 방향을 알려주는 다양한 도구들이었습니다. 혼자 걷는 것 보다는 둘이 낫고 나침반이라도 들고 걷는 편이 길찾기에 훨씬 유리합니다. 오늘은 개발중 생긴 문제들과 나침반 역할을 해준 Renderdoc에 대해 글을 작성해보겠습니다. ..

DirectX11 2025.04.23

[Effective C++] 항목 11: operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자

1. 개요자기대입은 어떤 객체가 자기 자신에게 대입 연산을 실행하는 것을 말합니다. 예를 들면 이런것이죠 Yeoul y; y=y; 문법상 아무 문제가 없는 코드입니다. a[i] = a[j]; i와j가 같아지면 자기대입이 됩니다. *pa = *pb; 둘이 가리키는 대상이 같으면 자기대입이 됩니다. 이러한 경우가 생기는 이유는 하나의 객체를 여러곳에서 참조하는 중복참조 상태 때문입니다. 이럴땐 같은 객체가 사용될 가능성을 고려하는것이 바람직한 자세입니다. void DoSomething(const Base& rb, Derived* pd);// 사실 rb와 *pb는 같은 객체였을지도 모릅니다. 결론은 자기 대입 연산은 생각보다 빈번하게 발생할 수 있다는 것이지요 2. 발생하는 문제들/해결법 2-1. 문제1자기대..

[Effective C++] 항목 10: 대입 연산자는 *this의 참조자를 반환하게 하자

1. 개요C++의 대입 연산자는 여러개가 동시에 엮일 수 있습니다. 무슨말인가 하면 우리는 일반적으로 대입연산자를 a=3; 이런식으로 씁니다. 그러나 a=b=c=3; 이런식으로 쓰는것도 가능하다는 말입니다. 우측 부터 연산이 진행되는 연산자입니다. 위의 연산을 괄호를 쳐서 본다면 이렇게 됩니다. a=(b=(c=3)); c에 3대입되고 그 결과가 b에 대입되고 다시 그 결과가 a에 대입됩니다. 이러한 연산이 가능하려면 연산자가 좌변에 대한 참조자를 반환하도록 구현되어 있어야 합니다.2. 다른것들은?좌변 객체의 참조자를 반환하자는 규칙은 = 뿐만 아니라 다른 경우에도 지켜져야 합니다. 예를들면 += -= *= 등과같은 연산고 *this를 반환하게 하는것이 관례입니다. 이 관례는 모든 기본제공 타입들이 따..

[DX11] Point Light Shadow - Peter Panning, Shadow Acne

1. 개요게임 세상에서 그림자를 띄울 수 있다면 보다 더 실감나는 게임이 될것입니다. 오늘 알아볼내용은 바로 그림자를 구현하는 방법입니다. 우선 그림자를 구현하기 위해서는 Depth값이 필요합니다. Depth 비교를 통해서 그림자가 지는 부분과 아닌 부분을 나누고 계산을 해서 구합니다. 자세한 원리는 차차 설명하도록 하겠습니다. 2. Depth를 비교한다는 것은?그렇다면 Depth를 비교한다는 것이 도대체 무슨 의미일까요? 결론부터 말하면 광원이 보고 있는 물체까지의 Depth(거리)와 광원과 물체사이의 실제 거리를 비교하는 것입니다. Depth값 보다 실제 거리가 더 길다면 그림자가 지는 구간이고 같다면 그림자가 지지 않는 부분입니다. 이렇게 말해서는 이해가 잘 안갈것입니다. Depth란것이 무엇인지 ..

DirectX11 2025.04.23