DirectX 11 3d 29

230629 FBX 애니메이션 로딩

fbx 로딩하고 나면 자체적으로 매쉬데이터로 전환하고 파일에 저장을 시킨다. 그래서 동일한 이름의 meshdata를 로딩한다. 한번이라도 로딩하면 meshdata 폴더에 그 이름의 .mdat 이 저장이 되고 그걸 로딩한다. .mdat는 자기가 무슨 메쉬를 참조하였고, 어떤 재질을 참조하고 있었는지(키값 저장), 그 재질 안에서 어떤 텍스쳐를 참조했는지 저장되어있다. mesh 함수에 가면 mesh 파일을 저장할 수 있는 save 함수를 구현해놨음. 그래서 두번째부터는 loadfbx가 아니라 findres 하면 된다. meshdata로 저장해두었으면, fbx파일이 필요없다 이미 저장이 되어 있기 때문에.. 애니메이션이 어떻게 돌아가는지? 정점만 저장하는게 아니라 클립이라고해서 애니메이션 클립정보가 저장되어있..

DirectX 11 3d 2023.07.14

230626 FBX 정적 매쉬 로딩

testlevel 에 fbx loading 이 추가 됨. fbx 파일은 3d max에서 디자이너들이 툴을 이용해서 모델링을 만들어서 모델링 파일을 추출할 때 사용하는 포맷이다. fbx파일 안에는 단순하게 정점같은 메쉬정보만 들어있는게 아니라, 거기에 입혀질 텍스쳐, 재질, 애니메이션같은 행렬정보도 들어있다. 모델링이 게임에서 표현되기 위한 종합적인 모든 데이터가 다 들어있다고 생각하면 된다. meshdata 클래스를 만듦. fbx파일을 분석하고 그 안에서 데이터를 추출해야한다. (우리가 직접할 수 없음) * autodest에 가면 fbx 해체하는? 그런 라이브러리를 제공함. global.h 에서 FBXLoader 헤더랑 라이브러리 참조하게 함. mesh 리소스랑 랜더컴포넌트 구조가 좀 바뀜, 전에는 랜더..

DirectX 11 3d 2023.07.13

230621 Directional Light Shadow

Directional Light Shadow 1. 그림자 깊이 맵을 이용함 ( 수업에서 사용 ) -> 난이도가 쉽고, 성능이 좋다. 깊이맵의 해상도가 중요하다.. 떨어지면 그림자가 모자이크?처럼 나와서 좀 떨어진다. 2. 스텐실 버퍼를 활용 -> 연산이 더 들어가는 대신에 정밀하다. 랜더매니저에 DepthMap MRT 추가 랜더타겟은 한 장짜리고, 기존에 사용하더 ㄴ깊이맵을 사용 안한다 DepthMap MRT -> 랜더타겟 한 장, 깊이텍스쳐 한 장으로 구성 (스왑체인이랑 비슷) (랜더타겟과 깊이텍스쳐의 해상도는 반드시 같아야한다) render_dynamic_shadowdepth -> 동적 그림자 생성이 추가됨 renderMgr.cpp void CRenderMgr::render_dynamic_shadow..

DirectX 11 3d 2023.07.13

230619 Mapmapping

노이즈처럼 나오는것을 해결 텍스쳐에 기능 추가 MinMap 1을 지정하면 원본만 만들어진다. MinMap 2을 지정하면 1일 때의 절반짜리 해상도가 하나 더 만들어진다. 즉, MinMap 레벨이 늘어날수록 가로세로 픽셀 수가 2의 승수로 줄어들기 때문에, 원본 텍스쳐보다 해상도가 훨씬 적어서 퀄리티가 떨어지면서 자체적인 알고리즘에 의해 색상이 낮은 저퀄리티 저해상도 버전을 만드는 것이다. 배열텍스쳐는 한 장이 여러 장으로 구성되어 있다. 이걸 만약 MinMap 을 8로 지정한다면, 텍스쳐 하나당 민맵이 8개 생성이 된다. LandScape.fx for (int i = 0; i < 4; ++i) { vColor += TileTexArr.SampleLevel(g_sam_0, float3(_in.vUV, i)..

DirectX 11 3d 2023.06.26

230615 LandScape - Splating(색칠)

타일이 32 by 32로 만들어서 한 칸에 patch 한 장씩 들어간다. (패턴이 반복됨) 왜냐하면 우리가 사용하는 샘플러가 램모드? 이기 때뭉니다. 램모드?는 UV가 1을 초과하면 넘어가더라도 다시 정수부분은 버리고 소수부분으로 샘플링을 시도한다. 카메라가 원점에 있다고 가정하고 거리에 따른 테슬레이션을 적용했다. 카메라 근처에 있는 애들은 16분할 그다음은 8분할 .. 그다음은 4... 이런식으로 분할레벨을 카메라로부터의 거리로 설정한다. 거리가 가깝냐 머냐에 따라서 엣지를 몇 분할할건지 정한다. 인사이드는 정점 3개를 더한다음에 3으로 나오면 중간값이 나오니까 그 위치가 어디냐에 따라 거리에 따른 분할을 잡는다. LandScape.fx float3 vUpDown = (_input[1].vViewPo..

DirectX 11 3d 2023.06.26

230609 LandScape Heightmap

원래 높이맵을 로딩해서 가져다 사용했는데, CreateTexture 에서 직접 메모리에 만들어서 사용 높이맵을 직접 메모리에 실시간으로 로딩했기 때문에 높이가 평평하다. 처음에는 텍스쳐가 검은색 (0으로 초기화가 되어있기 때문에 높이값이 0라는 의미) 포맷은 R32 FLOAT 이다. 4byte 포멧인데, 픽셀 1개가 플롯 1개이다. (높이만 저장할거니까) void CLandScape::CreateTexture() { // 높이맵 텍스쳐 //m_pHeightMap = CResMgr::GetInst()->FindRes(L"texture\\landscape\\HeightMap_01.jpg"); m_pHeightMap = CResMgr::GetInst()->CreateTexture(L"HeightMap" , 2..

DirectX 11 3d 2023.06.25

230607 LandScape 포워드 -> 디퍼드 전환

지형은 로컬에 있는 Normal을 사용하면 안된다. 스피어매쉬같은 경우에는, 로컬에서 정점들의 노말값이 노말맵을 사용하지 않아도 이미 정해져있다. (매끄럽게 표현이 됨) 지형메쉬는 로컬에 있는 노말값이 어느 정점을 찍어도 전부 다 위를 향하게 해놨다. 테셀레이션을 해도 원본이 위이기 때문에 전부 위를 향하고 있다. 높이맵을 가져와도 평평할 때의 기준의 노말값을 가지고 있어서 다 위를 향하고 있다. (왼쪽 그림) 오른쪽 그림처럼 저장이 되어야 한다.. 일반적인 디퍼드 쉐이더처럼 로컬에 있는 노말을 뷰로 보내서 타겟에 저장시키면 의미가 없다.. 지형이 변형되면서 만들어지는 것 기준으로 노말을 테셀레이션해서 다 계산을 해주어야한다. (높이맵을 적용시켰기 때문에) 이렇게하고 노말값을 디퍼드 타겟에 저장을 시켜놔..

DirectX 11 3d 2023.06.14

230602 지형 만들기, Height Map (다시)

1. 지형만들기 (수업 25분가량 못들음) - 기초 (4 by 4) vector vecIdx; for (int i = 0; i < m_iFaceZ; ++i) { for (int j = 0; j < m_iFaceX; ++j) { // 0 // | \ // 2--1 vecIdx.push_back((m_iFaceX + 1) * (i + 1) + (j) ); vecIdx.push_back((m_iFaceX + 1) * (i) + (j + 1)); vecIdx.push_back((m_iFaceX + 1) * (i) + (j) ); // 0--1 // \ | // 2 vecIdx.push_back((m_iFaceX + 1) * (i + 1) + (j) ); vecIdx.push_back((m_iFaceX + 1) ..

DirectX 11 3d 2023.06.04

230601 절두체 컬링 이어서

절두체 컬링 순서가 중요한 이유 원래 코사인세타가 작은 각도를 기준으로 판정돼서 나와서 둔각으로 하면 반대편?으로 돌아가버린다. 1. FrustumCheckByPoint class CFrustum : public CEntity { public: bool FrustumCheckByPoint(Vec3 _vWorldPos); bool FrustumCheckBySphere(Vec3 _vWorldPos, float _fRadius); public: CLONE(CFrustum); CFrustum(CCamera* _pOwner); ~CFrustum(); }; bool FrustumCheckByPoint(Vec3 _vWorldPos); => 점을 이용해서 절두체 내에 존재하는지 확인 bool CFrustum::Frus..

DirectX 11 3d 2023.06.04

230531 Frustum Culling, 평면의 방정식

1. 랜더링 최적화 (이전에 안 한 것..) Frustum Culling 컬링 작업이 랜더링 파이프라인에서 레스터라이저에 의해서 발생한다. NDC 좌표계에 안 들어오는 정점들을 버린다. 그런데 NDC 좌표계 안 들어왔다고 해서 무조건 다 버리는 것은 아니다. 정점 3개 중 전부 다 NDC 좌표와 겹치는지 아닌지 검사를 해서 일부라도 팻치가 들어오는지 레스터라이저에서 판단을 해야한다. 3개 다 들어오지 않는 경우, 다 버리면 된다. 정점 3개가 다 NDC 좌표계에 들어왔더라도 반시계로 들어왔다면, cull_back 모드를 사용하고 있다는 전제하에 뒷면이라고 생각하고 컬링을 하면 된다. Frustum Culling은 랜더파이프라인에서 작동하는게 아니라(GPU) 우리가 직접 CPU로 자체적으로 컬링하는 전처리..

DirectX 11 3d 2023.06.04