[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
영상 초반 내용을 보면 using FuncPtr = void();는 잘 사용하지 않는 문법이라고 하고, 뒤이어 나오는 using FuncPtr = void(*)();와 같은 형식을 자주 사용한다고 했는데 동일하게 동작한다면 오히려 앞쪽이 더 편한 것 아닌가요? (*)를 추가하는 이유가 단순히 포인터임을 표시해주기 위함 인가요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
(참고)실습 환경: 윈도우 11 Pro 24H2 26100.3194 DirectXTex 라이브러리를 다운받아 DirectXTex_Desktop_2022 솔루션을 Debug, Release 모드로 각각 빌드하여 강의 영상과 동일하게 아래와 같은 디렉토리 구조로 파일을 배치하였습니다. Library Include DirectXTex DirectXTex.h DirectXTex.inl Lib DirectXTex DirectXTex.lib DirectXTexD.lib 그리고 Engine 정적 라이브러리 프로젝트의 EnginePCH.h 파일에 #include <DirectXTex/DirectXTex.h> #include <DirectXTex/DirectXTex.inl> #pragma comment(lib, "d3d12") #pragma comment(lib, "dxgi") #pragma comment(lib, "dxguid") #pragma comment(lib, "d3dcompiler") #ifdef _DEBUG #pragma comment(lib, "DirectXTex\\DirectXTexD.lib") #else #pragma comment(lib, "DirectXTex\\DirectXTex.lib") #endif 위와 같이 추가하였고, 디렉터리 경로 또한 설정 완료된 상황입니다. Engine 프로젝트에는 모든 구성 x64 포함 디렉터리: $(SolutionDir)Library\Include\ Client 프로젝트에는 모든 구성 x64 포함 디렉터리: $(SolutionDir)Library\Include\, $(SolutionDir)Engine\ 모든 구성 x64 라이브러리 디렉터리: $(SolutionDir)Library\Lib\, $(SolutionDir)Output\ 이런 상황에서 Engine 정적 라이브러리를 빌드하면 통과하나, Client 프로젝트를 빌드하면 DirectXTex 의 두 함수 DirectX::CreateTexture, DirectX::PrepareUpload 에 대해 LNK2019 에러가 발생합니다. 경로 설정이나 lib 파일 설정 등등을 몇 번이나 확인했는데도 어디서 문제가 생기는 지 확인이 안되네요... 올려주신 강의 자료 프로젝트와 1:1로 비교해도 어디가 문제인지 발견이 안되는데, 어디를 점검해보면 될 까요...?
게임에서 보여지는 3차원 공간은 실제로는 4차원 공간으로 구성되어 있다고 들었습니다! 그런데, 제가 이해한 것이 맞는 지 잘 몰라서 질문을 남깁니다! "현실 세계에서 게임 속 3차원 공간의 물체를 바라볼 때, 그 안의 게임(가상 공간)은 4차원으로 구성되어 있다"가 맞을까요? 감사합니다.
고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
ObjectHandler / ObjectHandler.gd 파일에서 무기발사 구현하는 코드에서 instance.setup_weapon(dir, speed) 에서 방향벡터와 스피드 관련 해서 함수 호출하고 add(obj: Node2D, g_position: Vector2, dir: Vector2) 에서 dir (방향벡터)를 다시 rotation 에 대입하는지 좀 이해가 안됩니다.. 설명부탁드립니다..^^ 아래는 해당 소스코드입니다. instance.setup_weapon(dir, speed) call_deferred("add", instance, pos, dir) func add(obj: Node2D, g_position: Vector2, dir: Vector2) -> void: add_child(obj) obj.global _position = g_position obj.rotation = Vector2.RIGHT.angle_to(dir)
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
#include <iostream> using namespace std; class Player { public: Player() { cout << "Player()" << endl; } virtual ~Player() { cout << "~Player()" << endl; } }; class Pet { }; class Archer : public Player { public: Archer() { cout << "Archer()" << endl; _pet = new Pet(); } virtual ~Archer() { cout << "~Archer()" << endl; delete _pet; } public: Pet* _pet; }; int main() { Player* archer = new Archer(); delete archer; } 영상 내용에서 자식클래스의 소멸자에도 virtual 을 붙이셨는데 부모 클래스의 소멸자에만 붙여도 자식 클래스의 소멸자가 잘 호출이 됩니다. 그래서 GPT를 통해 둘 다 붙이는게 좋은지 부모 클래스에만 붙이는게 좋은지 질문해봤는데 부모 클래스에만 붙여도 문제가 없다고 답변을 받았습니다. 근데 루키스님께서 둘 다 붙이는 이유가 분명 있으실탠데 그 이유가 궁금합니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
수업내용을 놓쳤을 수도 있는데 어디를 놓친건지 몰라서 질문드립니다 기본적인 default object들과 UI object들의 랜더링을 원근투영과 직교투영을 이용하는 내용은 이해가 되나 둘 다 동일한 z버퍼를 사용하는걸로 아는데 그러면 투영변환의 인자 값에 상관없이 랜더링 파이프라인에서 z버퍼로 인하여 서로가 가려져야 한다고 생각했는데 정상적으로 출력이 되어 왜 그런지가 궁금합니다.
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Scene과 SceneManager 강의 수강 중 키보드 입력 오류가 있어서 문의드리게 되었습니다. DevScene의 Update()에서 키보드 입력을 받을 때 강의와 똑같이 코드를 입력했음에도 불구하고 콘솔창에서는 한쪽 방향으로만 오브젝트가 움직입니다. (만약 A를 입력하면 A로만 움직임.) 혹시 원인이 뭔지 알 수 있을까요?
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
안녕하세요! 10주차의 Window API 강의를 듣던 중 TimeManager.cpp에서 QueryPerformanceFrequency와 QueryPerformanceCounter메서드에 LARGE_INTEGER 타입으로 변환해서 인자를 넘겨주는 과정에서 오류가 있었는데 해결 과정을 문의하고 싶습니다. Types.h에 문제가 있을까 싶어서 찾아봤지만, 별다른 이상이 없어서 원인을 모르겠습니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
Tessellation 강의 중 (33:01 ~ 33:10)에 관하여 강의 내용이 올바르지 않다고 판단되어 질문 드립니다. insideTess를 값을 1에서 2로 변화하여 실행하여도 결과는 달라지지 않습니다. 또한, 제가 알고 있는 지식으로는 "DirectX의 삼각형 테셀레이션에서는 내부 테셀레이션 팩터가 정수값 1과 2에 대해 동일한 패턴을 생성하도록 설계되어 있다." 로 알고 있습니다. 위의 지식이 올바르지 않다면 답변으로 수정해주시길 바랍니다. 위의 지식이 올바르다고 판단하여 제가 도출한 결론으로는 다음과 같습니다. "insideTess 값이 2가 될 경우, 큰 삼각형 내부의 2개의 점으로 세부 선분들이 모이게 된다. 하지만 2개의 점으로 모일 경우 2개의 점은 필시 하나의 선분으로 이어지게 되는데, 이렇게 될 경우엔 큰 삼각형 내부에 세분화된 도형들이 전부 삼각형이 아닐 경우가 생긴다. 고로, insideTess 값이 2일 경우엔 1과 동일시 하여 큰 삼각형 내부의 세분화된 도형들을 전부 삼각형으로 만들어 표현한다." 이것이 제가 낸 결론이며, 지식과 결론에 대한 틀린 부분을 수정 부탁드립니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
렌더 타겟을 SRV로 사용을 하려고 합니다. 우선 결론을 말씀드리면 기존에 투명 파티클인 Bubble 파티클 뒤에 보이는 픽셀들에 굴절 효과를 추가하려고 합니다. 그러기 위해 렌더 타겟을 텍스쳐로 만들어서 SRV로 파티클 셰이더에 텍스쳐로 보내려고 합니다. 제가 시도해본 과정입니다. Scene의 RenderFinal 함수에서 shared_ptr로 renderTargetTexture을 가져와서 제가 만든 Resources 클래스의 멤버 변수인 _renderTargetTexture에 Set 하였습니다. (원래는 리소스의 상태를 렌더 타겟에서 SRV로 수정을 했어야 하나, 결과가 똑같아서 제외하였습니다.) 그리고 파티클 시스템의 FinalUpdate에서 RenderTargetTexture를 가져와서 0번 텍스쳐에 Set을 해주었습니다. 아래는 실행 결과입니다. 빨간색으로 표시된 부분은 제가 기존에 만들어봤던 파티클들이고 파란색으로 표시된 부분은 렌더 타겟을 텍스쳐로 만들어 셰이더에 전달한 것을 출력하는 파티클들 입니다. 결과를 보면 렌더 타겟에 보이는 빨간 부분 파티클들이 제대로 파란색 표시된 쪽에 출력이 된 것을 확인할 수 있었습니다. 그러나 렌더 타겟으로 파티클을 띄웠으면 배경이나 (가운데 잘 안보이지만) 구 객체도 같이 출력이 되었어야 하는데 파티클들만 출력이 된 것을 확인할 수 있었습니다. 아마 예상으로는 구나 배경(디퍼드 렌더링)을 찍는 0번 카메라와 파티클(포워드 렌더링)을 찍는 1번 카메라 중 1번 카메라만 렌더 타겟 텍스쳐로 전달이 되어서 발생하는 문제라고 생각했습니다. PIX로 디버깅을 해본 결과 여기는 또 이상하게 렌더 타겟에 보이는 모든 객체들이 셰이더에 SRV로 잘 전달이 되었다고 나오고 있습니다. 렌더링이 올바르게 되지 않는 결과를 알고 싶습니다. 또한 투명 파티클 뒤의 픽셀들을 굴절시키는 다른 좋은 방법이 있다면 그것 또한 알고 싶습니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
안녕하세요. DirectX12 강의를 이제 수강 시작한 학생입니다. 강의에선 C++ 언어 표준을 C++ 14로 사용중입니다. 전, C++ 20을 사용하여 아래와 같이 구조체 초기화를 사용하려 했습니다. DXGI_SWAP_CHAIN_DESC sd = { . BufferDesc = { . Width = static_cast< uint32 > ( info . width ), . Height = static_cast< uint32 > ( info . height ), . RefreshRate = { . Numerator = 60 , . Denominator = 1 }, . Format = DXGI_FORMAT_R8G8B8A8_UNORM , . ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED , . Scaling = DXGI_MODE_SCALING_UNSPECIFIED }, . SampleDesc = { . Count = 1 , . Quality = 0 }, . BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT , . BufferCount = SWAP_CHAIN_BUFFER_COUNT , . OutputWindow = info . hwnd , . Windowed = info . windowed , . SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD , . Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH }; 하지만, C++ 20을 사용하면 Engine 프로젝트 빌드 시, byte << 모호하다는 오류가 나오며, Engine.lib 파일이 Output 폴더 내에서 사라집니다. 억지로 빌드 시킨 후, Client 프로젝트 실행 시 오류가 생깁니다. C++ 20기준 혹은 미리보기 최신 C++ 초안 기능을 사용하여 구조체 초기화 사용을 유지 한 채 실행할 수 있는 방법이 있을까요 ?
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
멀티스레드 환경이라는 가정 하에, RefCountable 클래스만 존재할 때 발생하는 문제점은 이해를 했습니다. 그래서 TSharedPtr 클래스가 제공하는 이점이 RefCountable 클래스에서 여러 단계로 처리해서 다른 스레드가 침투하는 빈틈을 막기 위해서 마치 포장지로 덮듯 단일로 이루어지게끔 설계한 것이라고 이해하면 되는걸까요?
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
안녕하세요. 부모클래스의 함수를 override 하기 위한 목적으로 부모클래스 함수에 virtual 키워드를 붙여주고 자식클래스가 이 함수구현을 강제하기 위해 virtual 키워드를 사용하는 것으로 이해 했습니다. 하나 이해가 되지 않는 부분은, 소멸자에 virtual 키워드를 붙여주었을때, 부모클래스의 소멸자와 자식클래스의 소멸자가 이름이 다름에도 자식클래스 소멸자를 호출해준다는 것인데, 해당 내용을 Perplexity에 질문해보니 C++ 내부적으로 소멸자를 동일한 이름으로 취급하기 때문이라는 답변을 얻었습니다. 이 내용이 맞는건지 답변 부탁드립니다. 감사합니다.