안녕하세요 이번 강의를 잘 이해했나 의문이 들어서 질문 남깁니다 먼저 제가 이해한 내용을 설명해보자면 Normal Map이란 어떤 물체의 세부적 표현을 정점의 추가 없이 표현하기 위해서 나온 기술?이고 해당 Map의 각 픽셀의 RGB 값을 x, y, z로 해석하여 float4 map = NormalMap.Sample(LinearSampler, uv); [0, 1] 구간으로 변환 후 3D 세상에서 표현하기 위해 [-1,1]구간으로 변환 한다 float3 tangentSpaceNormal = (map.rgb * 2.0f - 1.0f); 그리고 이 값을 World좌표계로 변환하기위해 탄젠트 스페이서에서의 t,b,n을 좌표 변환 공식?에 의해 [tx, ty, tz] [bx, by, bz] [nx, ny, nz] 행렬이 나오게 되고 이러한 TBN 행렬을 이용해서 World 좌표로 치환할 수 있다 이렇게 정리해봤는데 잘못 이해하거나 누락된 부분이 있을까요?
안녕하세요 제가 알기로는 output.normal = mul(input.normal, (float3x3)World); 이렇게만 해줘도 월드 좌표에서의 단위벡터로 만들어 주는걸로 알고 있는데 GeometryHelper.cpp 파일에서 CreateSphere 메서드에서 v.normal = v.position; v.normal.Normalize(); Normal.fx 에서 normalize(input.normal) 위 1, 2 부분에서의 normalize를 안해도 별 차이 없지 않나요? 혹시 차이가 있다면 어떤 부분에서 차이가 있을까요? 아니면 제 개념이 틀렸을까요?
vector<VertexTextureData>& v = const_cast<vector<VertexTextureData>&>(_geometry->GetVertices()); for (int32 z = 0; z < height; z++) { for (int32 x = 0; x < width; x++) { int32 idx = width * z + x; uint8 height = pixelBuffer[idx] / 255.f * 25.f; v[idx].position.y = height; // 높이 보정 } } 이 부분을 계속 돌려봐도 이해가 안되는데 높이보정할 때 왜 저 식이 나오는건가요?
pragma comment로 불러오는 다른 lib들은 다 에러 없이 넘어가는데요, 정작 걱정했던 DirectXTex 들은 조용하지만 LNK1104 'd3dcompiler.lib' 파일을 열 수 없습니다. 저 d3dcompiler친구만 오류를 뿜뿜합니다ㅠ 이를 어쩌면 좋을까요 선생님 😣
안녕하세요 공부하다가 몇가지 궁금한게 생겨 여쭤봅니다. 질문1) D3D12_DESCRIPTOR_RANGE ranges[2] = { { D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 5, 0, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND }, // b0 ~ b4 { D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 5, 0, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND } // t0 ~ t4 }; CD3DX12_ROOT_PARAMETER rootParameters[1] = {}; rootParameters[0].InitAsDescriptorTable(_countof(ranges), ranges, D3D12_SHADER_VISIBILITY_ALL); 와 같이 루트시그니처에서 테이블의 사용범위를 넓게잡아두고 사용할때만 Shader 에서 buffer를 정의 ( ex :cbuffer WVP: register(b0 )해서 사용해주고있는데 테이블힙의 메모리 낭비를 제외하면 성능에 큰 악영향이 있을까요? 런타임에 터지거나 하는 오류는 현재 없는데 궁금해서 여쭤봅니다. 질문2) 제가 이해한게 맞는건지 모르겠습니다. 현재 영천님 의 코드처럼 pool 방식으로 디스크럽터를 넓게만들어두고 할당받는 방식으로 코드를 만들어보고있는데 질문1의 방식처럼 rootSignature 를 만들었다고 하였을때 , SetGraphicsRootDescriptorTable 함수인자에 핸들값을 넣을때 그림에 빨간 화살표에 있는 선두에 있는 handle 값만 넣어주면 RootSignature 에서는 b0~b5 ,t0~t5 의 총10개를 사용한다고 서명했기떄문에 , DX에서 읽을때 10개단위로 읽어주기 때문에 10개가 모두 테이블에 바인딩되는 구조인가요? 다음 오브젝트를 그릴때는 , 오프셋 10칸을 건너뛴 다음 b0 부터 할당받아서 테이블에 바인딩해주고
미리 컴파일된 헤더로 설정해 놓은 pch.h 파일에서 유독 #include "Transform.h" 를 못 받아들이는 것 같습니다. 계속해서 "'Transform': 선언되지 않은 식별자입니다." 라는 오류가 발생하고 신기한 건 #include "Transform.h"의 위치를 윗줄로 옮기면 그 밑에서 include 해주는 헤더파일도 동일하게 못받아들이고 "선언되지 않은 식별자입니다" 라고 에러를 뱉고 있습니다. 이런 경우는 어떤 해결 방법이 있을까요?ㅜㅜㅜㅜㅜㅜㅜㅜㅜ
섹션 1. DirectX11 입문 (1주차) 기본 프레임워크에서 DirectXTex_debug.lib 파일을 구하기 위하여 DirectXTex_Desktop_2022 솔루션을 Visual Studio 2022에서 디버그 모드로 빌드를 해도 파일이 보이지 않습니다. 빌드할 때 빌드 구성(Configuration)을 ‘Debug’로 설정하고, 플랫폼을 ‘x64’ 로 선택 후 빌드하였습니다. 빌드 과정에서 에러는 없었구요. DirectXTex_debug.lib 이 파일은 어떻게 얻을 수 있나요.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
for (int i = 0; i < v mesh.size(); ++i) { _shader->SetPipelineState(); core->GetCmdList()->IASetVertexBuffers(0,1,&_v_mesh[i]->GetVertexView()); core->GetCmdList()->IASetIndexBuffer(&_v_mesh[i]->GetIndexView()); _transform->Update(); core->GetTableHeap()->BindTexture(_texture->GetCpuHandle(), SRV_REGISTER::t0); core->GetTableHeap()->CommitTable(); core->GetCmdList()->DrawIndexedInstanced(_v_mesh[i]->GetIndexCount(), 1, 0, 0, 0); } DX11 버전에서 제공해주신 모델 탱크 를 로딩하려고Assimp 를 사용하였는데 , vmesh 사이즈가 12이라 12번 계속 반복해주는 코드를 작성하였는데 _v_mesh[0] 번째 정보만 바인딩되는데 문제가뭘까요..
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
안녕하세요 완강하고 질문드립니다. 루키스님 말씀대로 모든걸 다 이해하기보다는 개념적인 부분은 개념으로 듣고 많은 부분들을 들을 수 있어 감사합니다. 그래도 아직 부족함을 느끼고 어려운 개념들이 너무 많아서 DirectX 11 강의도 볼 까 고민중인데 이 강의랑 비슷한 맥락으로 진행되는지 궁금합니다. 차이가 있다면 어떤차이가 있는지, 해당강의를 들을것을 추천하시는지도 궁금합니다.
유니티에서 회전행렬을 확인 해보고자 출력을 했을 때. 이렇게 출력을 하였습니다. Transform을 해당 값으로 맞춰놓고 작업을 하였는데 Log 값은 이렇게 출력되었습니다. 여기서 의문점인경우가 Z축 회전 행렬을 적용하면 C -S 0 0 S C 0 0 0 0 0 1 0 0 0 1 이 적용이 되어야 하는데 Log 값으로 출력되는것을 보면 Sin값 적용부분에서 C -S S C 가 아닌 C S -S C 로 적용되는걸 알 수 있는데 왜 이렇게 값이 나오는 것인지 궁금합니다. (부호가 왜 바뀌어서 나오는지 궁급합니다.) X축 , Y축 , Z축 동일하게 출력을 해 보았으나 모두 다 같습니다...