[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
안녕하세요 완강하고 질문드립니다. 루키스님 말씀대로 모든걸 다 이해하기보다는 개념적인 부분은 개념으로 듣고 많은 부분들을 들을 수 있어 감사합니다. 그래도 아직 부족함을 느끼고 어려운 개념들이 너무 많아서 DirectX 11 강의도 볼 까 고민중인데 이 강의랑 비슷한 맥락으로 진행되는지 궁금합니다. 차이가 있다면 어떤차이가 있는지, 해당강의를 들을것을 추천하시는지도 궁금합니다.
인터넷에 찾아보니 구성 속성" > "C/C++" > "코드 생성" > "런타임 라이브러리 를 /MT 나 /MD 로 맞춰주라고 해서 맞추기도 해봤는데 계속 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보 오류 LNK2038 '_ITERATOR_DEBUG_LEVEL'에 대해 불일치가 검색되었습니다. '0' 값이 '2'(Game.obj에 위치) 값과 일치하지 않습니다. 가메코딩 C:\Users\shhmu\Desktop\GameCoding_tmp\가메코딩\DirectXTex.lib(DirectXTexImage.obj) 1 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보 오류 LNK2038 'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MD_DynamicRelease' 값이 'MTd_StaticDebug'(Game.obj에 위치) 값과 일치하지 않습니다. 가메코딩 C:\Users\shhmu\Desktop\GameCoding_tmp\가메코딩\DirectXTex.lib(DirectXTexImage.obj) 1 이런 에러가 나타나는데 어떻게 해야 할까요??
SRT에서 Scale 행렬과 Rotation 행렬 곱하는 순서를 바꿀 경우 최종 결과값을 얻는 데에는 상관없지 않나요? Translation 행렬은 아예 기준 좌표계 기준을 옮기는 행위여서 Translation 행렬이 언제 곱해지나에 따라 결과값에 차이를 만들어 낼 수 있는데, Scale과 Rotation 은 좌표계 기준을 옮기는 행렬이라고 생각이 안 되어서 여쭤봅니다.
수업 자료로 받은 솔루션에서도 삼각형이 안나오길래 자세히 보니까 점이 세개 찍혀있더군요 TriangleDemo 클래스의 Render 부분에 DC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 이렇게 따로 추가를 해주니 정상적으로 삼각형이 나옵니다 그래서 엔진에 IASetPrimitiveTopology 를 호출 하고있나 확인 해봤는데 없더군요 혹시 이번에 추가된 Effect11에서 이 기능을 대체 하는건가요? 그래픽카드는 AMD 입니다
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 다렉12 수강중인데 ID3D12DescriptorHeap ==> ID3D12Resource 들을 담아 관리하기 위한 자료구조 ID3D12Resource ==> 실제 GPU 메모리 상에 존재 , 여러가지 뷰들이 존재 , 디스크럽트힙 메모리에 담겨서 관리됨 D3D12_CPU_DESCRIPTOR_HANDLE ==> GPU 상에 존재하는 ID3D12Resource 들을 CPU 코드영역 에서 관리하기 위해 핸들값을 가져오는것 ID3D12Resource == 뷰 혹시 틀린부분이 존재할까요 ? 감사합니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
안녕하세요 다렉12 수강중인데 ID3D12DescriptorHeap ==> ID3D12Resource 들을 담아 관리하기 위한 자료구조 ID3D12Resource ==> 실제 GPU 메모리 상에 존재 , 여러가지 뷰들이 존재 , 디스크럽트힙 메모리에 담겨서 관리됨 D3D12_CPU_DESCRIPTOR_HANDLE ==> GPU 상에 존재하는 ID3D12Resource 들을 CPU 코드영역 에서 관리하기 위해 핸들값을 가져오는것 ID3D12Resource == 뷰 혹시 틀린부분이 존재할까요 ? 감사합니다.
안녕하세요, 이번 강의와 이전 강의(좌표계 변환 행렬)을 듣고, 좌표계 변환 행렬에서 '(B좌표계 기준) u,v,w의 성분'을 채우는 부분에 대해 제가 이해한 게 맞는지 확인차 문의드립니다. 로컬 좌표계에서 월드 좌표계로 변환할 경우. 월드 좌표의 단위벡터 U,V,W 는 각각 U(1,0,0) , V(0,10), W(0,0,1) 이고, 이를 이용해 로컬 좌표계의 단위 벡터(u,v,w)의 성분을 보면 u = ux*U + uy*V + uz*W v = vx*U + vy*V + vz*W w = wx*U + wy*V + wz*W U,V,W가 위의 단위 벡터이므로, 좌표계 변환 행렬을 채울 때 '(B좌표계 기준) u,v,w의 성분'에 로컬 좌표계의 단위벡터를 그대로 채우면 된다. 또한 u,v,w는 로컬 좌표계의 Right, Up, Look 벡터이므로 이를 그대로 채우는 거라고도 할 수 있다. 이번 강의의 약 21분 50초 즈음 내용. 로컬 좌표계가 월드 좌표계에서 Y축으로 45도 회전한 상태라면, 로컬 좌표계의 단위벡터도 월드 좌표계의 단위벡터 U,V,W에서 Y축으로 45도 회전했다고 볼 수 있으므로 y축 회전행렬을 적용한다. 월드 좌표계로 변환하는 게 아닌 A->B 변환이라면, B좌표계 기준에서 A좌표계의 단위 벡터 u는 u = ux*U + uy*V + uz*W(여기서 U,V,W는 월드 좌표계의 단위벡터가 아님)인데 , 항상 u = (ux, uy, yz)라고 할 수 없으므로 '(B좌표계 기준) u,v,w의 성분' 을 채울 때 A좌표계의 단위벡터(혹은 Right, Up, Look 벡터)를 그대로 채울 수 없다. 예로 u = (2,2,2) / U = (1,-1,0) / V = (0,1,0) / W = (0,0,1) 이라면 u = 2U + 4V + 2W이고, uy == 4 라면 u = (2,2,2)가 성립되지 않는다. 특히 3번은 틀린 듯 한데 제가 이해를 제대로 못 해서 맞다/틀리다를 판단하기가 어렵네요 ㅜ 질문에 대한 답변 외에도 표현상의 문제를 체크해주시는 것도 감사하겠습니다.
1. 클래스 생성자 매개변수가 레퍼런스인 스타일은 Init()으로 데이터를 초기화 하는 스타일보다 불편하다고 생각을 하는데(레퍼런스 때문에 헤더파일에 선언만 하는게 힘들다던지) 제 생각이 맞나요? 어떤 것이 표준에 가깝나요? 2. 저만의 게임 엔진을 구축하는게 목표라서 코드를 적으면서 했습니다만 난이도가 너무 높아서 좌절했습니다 개인적으로 DirectX를 이해하는것보다 전체적인 소스 아키텍처가 더 어려웠습니다 이 정도 소스 난이도는 프로그래머라면 쉽게 이해 가능한 수준인건가요? 아니면 어려운게 맞는건가요? 그리고 게임 엔진을 만들려고 한다면 이 강의 이후 게임 엔진 아키텍쳐 책이나 디자인 패턴을 열심히 공부하는 방향이 맞을까요? 3. 루키스님의 소스를 참고해서 게임 엔진을 구축하고 그 엔진을 이용해서 간단한 게임을 만든다면 저작권 부분이 어떻게 될지 궁금합니다 질문이 많아서 죄송합니다 좋은 강의에 항상 감사하게 생각하고 있습니다
안녕하세요 루키스님! 현재 언리얼 멀티플레이어 슈팅게임 프로젝트가 하나 있고 싱글 슈터 게임 프로젝트도 있습니다. 제가 지원하고 싶은 회사가 directX3D 활용 능력을 봐서 언리얼 포폴을 어느정도 마무리하고 directX 를 다시 보는 중인데, 루키스님 강의를 듣고 간단한 게임(뱀서라이크류나 전투 정도 가능한) 포폴을 만들 수준이 될까요? 그게 안된다면 렌더러에서 캐릭터 애니메이션(WASD 점프) 정도만 할려고 합니다.
//Material Name const aiMaterial* material = _scene->mMaterials[srcMesh->mMaterialIndex]; mesh->materialName = material->GetName().C_Str(); 하나의 메시가 여러 서브 메시를 포함하는 형태로 저장을 하게 되고, 그에 따라서 메시는 각 서브 메시에 따르는 머티리얼을 저장해야 하는데 해당 코드를 통해서는 마지막 서브 메시의 머티리얼만 저장하게 되는것이 아닌지 궁금해서 질문 드립니다.
항상 감사드립니다! 강의를 들으면서 제가 이해한대로 내용의 핵심만 정리 해보았는데요. 제가 이해한게 맞는지 확인 해주시면 정말로 감사드리겠습니다! 1. 이렇게 이해한게 맞을까요? u... v... w... 들은 A좌표계의 단위 벡터들을 B좌표계 기준으로 분해한 성분들을 의미한다. 만약 A좌표계가 원점(0, 0, 0)이면, 단위 벡터 u = [1, 0, 0], v = [0, 1, 0], w = [0, 0, 1]일 텐데 이런 기준이 되는 단위 벡터를 B좌표계의 시점에서 자신의 단위 벡터를 기준으로 표현하면 각각 U = [ux, uy, uz], V = [vx, vy, vz], W= [wx, wy, wz]라는 말이다. 이때 ux, uy, uz같은 성분들은 B좌표계를 기준으로 A 좌표계의 단위 벡터 u의 각각의 성분으로 표현한 값이다. 그리고 Qx, Qy, Qz는 B좌표계 중심점을 기준으로한 A좌표계의 중심점의 위치를 의미한다. 진짜 최종적으로 정리해서... 우리는 B좌표계 기준의 단위 벡터들 U, V, W를 A 좌표계의 단위 벡터로 표현한 성분 정보(ux, u...)들만 있으면 A 좌표계의 어떤 위치들이라도 B 좌표계 기준의 위치 정보를 얻어내는게 가능하게 된다. Qx, Qy, Qz는 얻기가 쉽다. (다른 좌표계면 당연히 해당 좌표계의 위치 정보를 알고 있을테니) ----------------------------------------- 2. 만약 마지막 원소를 1이 아닌 0으로 바꿀 경우 강사님께서 "A좌표계의 방향 벡터가 B좌표계에서는 어떤 값으로 표시되는지 알고 싶을 때 사용한다"라고 말씀하셨는데 마지막 원소가 날아가버린다면 계산시 Qx, Qy, Qz정보가 날아가버린다는 의미이므로. A 좌표계에서의 방향 벡터를 B기준에서의 방향 벡터로 변환한다라고 봐도 무방할까요?
한 GameObject 내부에서 선언되는 Parent, Children와 한 MeshRenderer 내부에서 선언되는 Mesh, Material 등등과 같은 리소스들은 각각 Scene과 ResourceManager내부에서 관리(생성, 파괴)되기 때문에 이런 관리해주는 클래스 에서만 shared_ptr로 생성해주고 다른 클래스 에서는 weak_ptr로 전해받았었습니다. 그런데 문뜩 든 생각이 결국 다른 클래스에서 이런 객체들을 사용하기 위해 프레임마다 weak_ptr::lock을 사용하여 shared_ptr로 만들어서 사용할텐데 이러면 비용 부담이 너무 많이되어 배보다 배꼽이 큰 상황이 발생하는 것 같다는 생각이 들었고 이럴바엔 그냥 왠만한 클래스에선 리소스를 shared_ptr로 선언하고 사용한 후 관리해주는 클래스(Scene, ResourceManager)들에서 삭제될때 여기서도 동시에 shared_ptr를 지워버리는식으로 관리를 해주는게 더 좋을 것 같다고 생각을했는데 과연 옳은 생각인 건가요?