묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
LNK1104 error, DirectXTexD.lib 파일을 열 수 없습니다.
같은 위치에 있는 DirectXTex.lib파일은 에러가 안나는데 디버그용파일만 에러가 나오네요. 계속해서 파일위치 확인했지만 찾을 수가 없어 qna남깁니다.
-
미해결[게임 프로그래머 도약반] DirectX11 입문
64.애니메이션 강의의, AssimpTool 에서 FBX 애니매이션 데이터를 옮길 때의 강의 오류가 있는 것 같습니다.
문제는 해결했지만, 강의에 큰 오류가 있는 것 같아, 강의를 듣는 분들에게 공유하는 것이 좋다 생각돼서 글을 작성했습니다. 강의의 Transform 코드가 미흡하다 생각해서, [LH, row_major, 요우->피치->롤] 을 전제로 하는 Transform ( Vec3, Vec4, Matrix3x3, Matrix4x4, Quaternion ) 을 다른 교재(이득우저 게임수학) 를 참조하여, 강의 코드에 적용해서 공부하고 있었습니다. 문제없이 잘 진행되다, 65.애니매이션 #2 에서 AssimpTool 로 FBX를 변환한 데이터를 애니매이션 진행할시, 로테이션이 반대로 되는 문제가 있었습니다. 이틀에 걸려 문제 원인을 찾았는데, 원인 코드는 아래와 같습니다 (강의 코드의 AssimpTool 프로젝트의 Utils 파일의 Converter.cpp 의 내용) /*std::shared_ptr<asAnimationNode> Converter::ParseAnimationNode(shared_ptr<asAnimation> animation, aiNodeAnim* srcNode){ std::shared_ptr<asAnimationNode> node = make_shared<asAnimationNode>(); node->name = srcNode->mNodeName; uint32 keyCount = max(max(srcNode->mNumPositionKeys, srcNode->mNumScalingKeys), srcNode->mNumRotationKeys); for (uint32 k = 0; k < keyCount; k++) { asKeyframeData frameData; bool found = false; uint32 t = node->keyframe.size(); // Position if (::fabsf((float)srcNode->mPositionKeys[k].mTime - (float)t) <= 0.0001f) { aiVectorKey key = srcNode->mPositionKeys[k]; frameData.time = (float)key.mTime; ::memcpy_s(&frameData.translation, sizeof(Vec3), &key.mValue, sizeof(aiVector3D)); found = true; } // Rotation if (::fabsf((float)srcNode->mRotationKeys[k].mTime - (float)t) <= 0.0001f) { aiQuatKey key = srcNode->mRotationKeys[k]; frameData.time = (float)key.mTime; frameData.rotation.x = key.mValue.x; frameData.rotation.y = key.mValue.y; frameData.rotation.z = key.mValue.z; frameData.rotation.w = key.mValue.w; found = true; } */ ==>> 위 코드에서, Quaternion 로테이션을 전치하기 위해, x, y, z 의 부호를 거꾸로 하는 코드가 필요합니다. 수정한 제 코드에는 아래와 같습니다 frameData.rotation.X = -key.mValue.x; frameData.rotation.Y = -key.mValue.y; frameData.rotation.Z = -key.mValue.z; frameData.rotation.W = key.mValue.w; 저렇게 코드를 수정하니, (LH, row_major) 를 전제로 하는 Transform 코드에서 잘 작동하더군요. 물론 강의의 DirectX::SimpleMath 를 바탕으로 만들어진 Transform 을 사용하면 아무 문제 없습니다.제가 SimpleMath를 제대로 이해하지 못해서, 어떻게 강의 코드가 잘 작동하는지를 이해하지는 못했고, 여전히 의문이 남습니다. 강의에서도 FBX 데이터는 RH 를 전제로 만들어졌고, 강의는 LH 를 전제로 하기에, AssimpTool 에서 본 트랜스폼 데이터를 변환할 때에, 아래 강의 코드인 Converter::ReadModelData 에서,bone->transform = transform.Transpose();트랜스폼을 전치합니다. Converter::ReadKeyframeData 에서도, if (findNode == nullptr) 에서도transform = transform.Transpose();로 전치를 하는데,앞서 제가 수정했던 else (애니매이션 데이터가 있는 부분) 에서는 전치 (rotation을 거꾸로 전환하는 코드)가 누락됐습니다. 정리하면, 강의의 일부 코드에서는, RH -> LH 를 위한 전치(로테이션 거꾸로) 코드가 있는데, 일부 코드에서는 전치 코드가 없는데도, 강의 코드는 잘 작동한다는 겁니다. 아무튼 제 문제는 해결됐습니다. 강의를 보다 혼동하실 분들이 제 글을 참고했으면 좋겠네요. 제 코드를 담은 깃허브 링크도 공유합니다https://github.com/HeeTaeKim996/Learning_DirectX11_3D
-
미해결[게임 프로그래머 도약반] DirectX11 입문
SkyDemo에서 카메라 입력이 작동하지 않는 문제
SkyBox 실습에서 화면에 텍스처 렌더링까지는 잘 되는데, 문제는 실행했을 때 WASD 입력을 넣어도 카메라가 움직이질 않습니다. 회전 행렬이 잘못 적용되어서 텍스처가 함께 이동하는 건가 해서 Update에 아래와 같이 회전을 직접 줘봤는데, 이 때는 카메라 회전이 되어 하늘이 움직이는 것처럼 잘 보입니다. _camera->GetTransform()->SetRotation(Vec3(0, _rotation, 0)); _rotation += 0.25f * DT; 제공해주신 A-34)+SkyBox에서 다른 데모는 카메라 입력이 잘 되는데, SkyDemo만 동일한 문제가 발생했습니다. 마찬가지로 카메라 입력이 먹히질 않습니다. 중단점을 찍고 디버깅을 해봐도 InputManager::Update()와 CameraScript::Update()가 매 프레임 정상적으로 호출되고 있었습니다.혹시 SkyDemo의 특정 초기화 순서나 렌더링 파이프라인 설정이 다른 데모와 달라서 입력 이벤트 처리에 영향을 주는 건 아닌지 궁금합니다.아직 해결하지 못해서 질문을 올립니다..
-
미해결[게임 프로그래머 도약반] DirectX11 입문
섹션6. DirectX 11 3D 입문 강의부터 렌더링이 안됩니다
섹션6. DirectX 11 3D 입문 강의부터 렌더링이 안됩니다. 해당 강의의 삼각형이 렌더링되지 않습니다. 혹시 제 실수일까 하여 강의 자료를 다운받아 시행해봐도, 렌더링이 되지 않네요.. (이전까지의 강의들에서는 잘 됐습니다)해당 강의부터 파이프라인을 직접 만들어사용하지 않고, effects11.lib 을 사용하는데, 그부분에서 특정 GPU 가 읽어드리지 못하는 것이 아닌가 생각을 하고 있지만 확실하지가 않네요..혹시 이 문제를 해결하셨거나 원인을 찾으신 분이 계시다면, 답변 부탁드리겠습니다..
-
미해결D3D12 프로그래밍 - 기초편
CommandList의 GraphicsCommandList 변경이유
코드를 따라가다 보니 기존엔 ID3D12CommandList를 사용하던걸 ID3D12GraphicsCommandList로 바꾸신 부분들이 있으신데 혹시 특별한 이유가 있을까요?
-
해결됨D3D12 프로그래밍 - 기초편
[25:13] Virtual Interface 와 COM Interface간의 차이가 궁금합니다.
안녕하세요. 먼저 좋은 강의 감사드립니다.해당 강의 부분에서 pDebugController 변수를 Virtual Interface라고 말씀하셨는데,COM Interface와 차이가 있는지 궁금합니다!다른 COM 인터페이스 변수들에 대해서 디버깅으로 값을 확인해봐도 pDebugController처럼 IUnknown을 상속받고 가상함수 테이블을 가리키는 포인터가 있으므로 동의어라고 봐도 될까요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
텍스처와 UV 강의 관련해서 문의드려요
섹션 2. DirectX11 입문 (1주차)텍스처와 UV강의를 수강하면서 코드를 실행했는데요이미지가 강의 내용과 다르게 보입니다어느 부분이 잘 못 되었을까요?소스 코드 상에서 다른 부분은 없는것 같은데요... 사각형은 강의 내용과 동일하게 그려집니다 {_vertices.resize(4);// 13// 02_vertices[0].position = Vec3(-0.5f, -0.5f, 0.f);_vertices[0].uv = Vec2(0.f, 1.f);// _vertices[0].color = Color(1.f, 0.f, 0.f, 1.f);_vertices[1].position = Vec3(-0.5f, 0.5f, 0.f);_vertices[1].uv = Vec2(0.f, 0.f);// _vertices[1].color = Color(1.f, 0.f, 0.f, 1.f);_vertices[2].position = Vec3(0.5f, -0.5f, 0.f);_vertices[2].uv = Vec2(1.f, 1.f);// _vertices[2].color = Color(1.f, 0.f, 0.f, 1.f);_vertices[3].position = Vec3(0.5f, 0.5f, 0.f);_vertices[3].uv = Vec2(1.f, 0.f);// _vertices[3].color = Color(1.f, 0.f, 0.f, 1.f);} struct VS_INPUT{float4 position : POSITION;// float4 color : COLOR;float2 uv : TEXCOORD;};struct VS_OUTPUT{float4 position : SV_POSITION;// float4 color : COLOR;float2 uv : TEXCOORD;};// IA - VS - RS - PS - OMVS_OUTPUT VS(VS_INPUT input){VS_OUTPUT output;output.position = input.position;// output.color = input.color;output.uv = input.uv;return output;}Texture2D texture0 : register(t0);Texture2D texture1 : register(t1);SamplerState sampler0 : register(s0);float4 PS(VS_OUTPUT input) : SV_Target{float4 color = texture0.Sample(sampler0, input.uv);return color;// return input.color;// return float4(0, 1, 0, 0);}// float4 main( float4 pos : POSITION ) : SV_POSITION// {// return pos;// }
-
미해결[게임 프로그래머 도약반] DirectX11 입문
frame간 보간에 대해서 질문이있습니다.
영상에서는 ModelAnimator의 update함수에서keyframeDesc의 sumtime을 갱신해줄 때 다음과 같은 코드로 작성되었는데.shared_ptr<ModelAnimation> current = model->GetAnimationByIndex(keyframeDesc.animIndex); if (current) { float timePerFame = 1 / (current->frameRate * _keyframeDesc.speed); if (_keyframeDesc.sumTime >= timePerFame) { keyframeDesc.sumTime = 0; //keyframeDesc.sumTime - timePerFame; // 0 keyframeDesc.currFrame = (keyframeDesc.currFrame + 1) % current->frameCount; keyframeDesc.nextFrame = (keyframeDesc.currFrame + 1) % current->frameCount; } keyframeDesc.ratio = (keyframeDesc.sumTime / timePerFame); } 이 부분에서 _keyframeDesc.sumTime = 0;이런식으로 sumTime을 0으로 하는것보다,keyframeDesc.sumTime = keyframeDesc.sumTime - timePerFame;처럼 계산 후 남는 값을 넣어주는 것이 더 정확하지 않을까요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
자료 pptx가 아닌 pdf
안녕하세요! 자료를 pptx가 아닌 pdf 형식으로도 제공해주실 수 있을까요
-
미해결[게임 프로그래머 도약반] DirectX11 입문
어디에 좀더 집중해야하나 고민입니다
게임프로그래머를 꿈꾸는 학생입니다Directx를 공부하면서 선형대수학을 공부를 병행하고 있습니다 성형대수를 공부하면서 드는 생각은 성형대수을 깊게 공부해도 의미가 없을 듯한 느낌을 받아서 질문드립니다.이 시간에 좀더 엔진공부를 하거나 아니면 알고리즘 공부를 해야하나 싶습니다강사님께서는 어떻게 생각하시나요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
CameraPosition 질문있습니다
V행렬의 41,42,43 의 값은 -(월드 좌표계 기준 카메라의 위치) 값을 반환하는게 아니라 (카메라 좌표계 기준 원점의 위치)를 반환하는 것 아닌가요?카메라가 회전하지 않고 원점과 rotation이 같다면 괜찮겠지만카메라가 회전할 경우에는 단순히 -로 값은 반전 시켜서는 (월드 좌표계 기준 카메라 위치)를 얻을 수 있는게 아닌 -(카메라 좌표계 기준 원점의 위치)를 얻게 되어서 예상과 다른 결과를 얻게 되는게 아닌가 싶어서 질문 드립니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
[DirectXTex LNK2019 에러]
(참고)실습 환경: 윈도우 11 Pro 24H2 26100.3194 DirectXTex 라이브러리를 다운받아 DirectXTex_Desktop_2022 솔루션을 Debug, Release 모드로 각각 빌드하여 강의 영상과 동일하게 아래와 같은 디렉토리 구조로 파일을 배치하였습니다.LibraryIncludeDirectXTexDirectXTex.hDirectXTex.inlLibDirectXTexDirectXTex.libDirectXTexD.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로 비교해도 어디가 문제인지 발견이 안되는데, 어디를 점검해보면 될 까요...?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
구와 육면체에 텍스쳐가 입혀지는 방식이 다른 이유
구는 한 개의 이미지로 텍스쳐가 입혀지고 육면체는 면마다 하나의 이미지 총 6개의 이미지로 입혀지는데 이러한 차이가 구현되는 부분이 어디인지 궁금합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
UI 랜더링이 이해가 안되어 질문드립니다
수업내용을 놓쳤을 수도 있는데 어디를 놓친건지 몰라서 질문드립니다기본적인 default object들과 UI object들의 랜더링을원근투영과 직교투영을 이용하는 내용은 이해가 되나둘 다 동일한 z버퍼를 사용하는걸로 아는데 그러면 투영변환의 인자 값에 상관없이 랜더링 파이프라인에서 z버퍼로 인하여 서로가 가려져야 한다고 생각했는데정상적으로 출력이 되어 왜 그런지가 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
insideTess 값 관련 질문
Tessellation 강의 중 (33:01 ~ 33:10)에 관하여강의 내용이 올바르지 않다고 판단되어 질문 드립니다.insideTess를 값을 1에서 2로 변화하여 실행하여도 결과는 달라지지 않습니다.또한, 제가 알고 있는 지식으로는 "DirectX의 삼각형 테셀레이션에서는 내부 테셀레이션 팩터가 정수값 1과 2에 대해 동일한 패턴을 생성하도록 설계되어 있다." 로 알고 있습니다.위의 지식이 올바르지 않다면 답변으로 수정해주시길 바랍니다.위의 지식이 올바르다고 판단하여 제가 도출한 결론으로는 다음과 같습니다."insideTess 값이 2가 될 경우, 큰 삼각형 내부의 2개의 점으로 세부 선분들이 모이게 된다. 하지만 2개의 점으로 모일 경우 2개의 점은 필시 하나의 선분으로 이어지게 되는데, 이렇게 될 경우엔 큰 삼각형 내부에 세분화된 도형들이 전부 삼각형이 아닐 경우가 생긴다. 고로, insideTess 값이 2일 경우엔 1과 동일시 하여 큰 삼각형 내부의 세분화된 도형들을 전부 삼각형으로 만들어 표현한다." 이것이 제가 낸 결론이며, 지식과 결론에 대한 틀린 부분을 수정 부탁드립니다.
-
미해결[게임 프로그래머 도약반] DirectX11 입문
안녕하세요 roatation 행렬 질문있습니다.
여기에서 v x M을 하게 되면, X = xcos B+ ysin B Y = -xsinB + ycosB가 나오는거 같아서 질문 올립니다.
-
미해결[게임 프로그래머 도약반] DirectX11 입문
'C\ .... ......lib'은 올바른 win32에플리케이션이 아닙니다.
'C\.... ......lib'프로그램을 시작할 수 없습니다.'C\ .... ......lib'은 올바른 win32에플리케이션이 아닙니다. 뭐 때문에 그러는 건가요
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
렌더 타겟을 SRV로 사용하려고 합니다.
렌더 타겟을 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
C++ 언어 표준과 Engine.lib 오류에 관하여..
안녕하세요. 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++ 초안 기능을 사용하여 구조체 초기화 사용을 유지 한 채 실행할 수 있는 방법이 있을까요 ?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
버텍스버퍼 실습 도중 버그
Vertex Buffer 코드를 따라치며 똑같이 했다 생각하는데(재생시간 14분가량), 아래 그림처럼 가운데에 그림이 안나와서 .. device 포인터 주소는 제대로 갖고오는걸 확인했는데 어디가 문제인지 모르겠어요. 구글 드라이브