전체 글177 77_RenderManager 구조정리 충돌과 관련된 부분과 Picking과 관련된 부분을 공부하게 될텐데 앞서서 정리를 해본다. RenderManager로 편리하게 쉐이더 코드를 연결했는데 조금씩 문제가 일어나고 있다. 쉐이더가 많아지고 동일한 쉐이더를 항상 사용하는게 아니다 보니까 각기 사용하는 방식이 달라지는데 그 때 마다 Init을 하게 되면 기본에 있던 애들이 날아가기 때문에 이 방식을 고수 할 수 없다. 쉐이더를 여러개를 써서 상황에 따라서 물체를 배치하거나 이런 부분이 필요하기 때문이다. void RenderManager::Init(shared_ptr shader) { _shader = shader; _globalBuffer = make_shared(); _globalBuffer->Create(); _globalEffectBuff.. DirectX 2024. 3. 24. 76_StructureBuffer byte address 즉 raw buffer를 통해서 실질적으로 compute shader 랑 작업하는 것을 알아봤고, texture buffer를 이용해서 texture를 조작하는 것을 알아봤다. 대부분의 경우는 raw buffer 보다는 structured buffer라는 것을 이용해서 원하는 구조체의 배열을 만들어서 관리하는 게 쉽다. 1. StructuredBuffer 클래스 만들기 Engine/05. ComputeShader/Buffer 필터에 StructuredBuffer 클래스를 만든다. #pragma once class StructuredBuffer { public: StructuredBuffer(void* inputData, uint32 inputStride, uint32 inputCo.. DirectX 2024. 3. 23. 75_TextureBuffer Texture를 건네주어서 받아오는 작업을 해본다. 1. TextureBuffer 클래스 만들기 Engine/05. ComputeShader/Buffer 필터에 TextureBuffer라는 클래스를 만든다. 일반적인 Raw buffer로 데이터를 주고 받는게 아니라 텍스쳐를 주고받는 형태가 될 것이다. 실습할 때는 veigar 이미지를 조작을 해서 다른 색상을 입혀서 return 받는 방식으로 작업을 해 볼 건데 texture 이미지 자체가 하나의 2D 이미지이다 보니까 픽셀 단위로 정보가 많다. 그걸 부숴서 여러 개의 스레드가 처리할 수 있게 분산을 해보도록 한다. 지난 시간에 작업했던 Raw buffer와 크게 다르지는 않다. 마찬가지로 기본 input, output과 관련된 정보가 있을 것이고, 그.. DirectX 2024. 3. 22. 74_System Value 분석 굉장히 중요하다 이 문서를 살펴 보면 된다. https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/sv-groupindex#remarks SV_GroupIndex - Win32 apps 스레드 그룹 내에서 컴퓨팅 셰이더 스레드의 \ 0034;flattened \ 0034; 인덱스로, 다차원 SV\_GroupThreadID를 1D 값으로 바꿉니다. SV\_GroupIndex 범위는 0~(numthreadsX \ numthreadsY \ numThreadsZ) \ 8211; 1까지입니다. learn.microsoft.com 셀 단위로 있는게 병사라고 가정을 하고 병사들이 오와 열을 이뤄서 3차원의 배열을 만든 상태라고 보면 된다. 쓰레드를 10, 8, .. DirectX 2024. 3. 22. 73_RawBuffer 컴퓨트 쉐이더(CPU가 아닌 GPU에 일을 넘기는 방식)에 대해 알아볼 것이다. 지금까지 작업한 WinMain의 코드들은 CPU에서 돌아가는 코드들이었다. Engine 프로젝트 쪽에 있는 DirectX로 처리되는 게 GPU에 의해 처리되는 것이다. 렌더링 파이프라인을 타서 GPU에서 이용되는 거였다. GPU한테 일을 시키기 위해 Shader를 만들어서 이런저런 걸 기술해서 GPU에게 시킬 수 있었다. 역사적인 부분을 봐야 한다. CPU는 코어 개수가 많지 않지만 개개인이 똑똑한 직원들이다 GPU는 몸값은 낮지만 숫자가 많다고 볼 수 있다. GPU, CPU 양쪽을 바쁘게 하는 게 최종 목표다. CPU는 할게 많으니 언제든지 찾을 수 있는 반면 GPU는 상대적으로 Rendering 부분 외에는 아직까지 사용.. DirectX 2024. 3. 21. 72_Quaternion 제곱을 하면 -1이 되는 숫자가 있다. 잠재적으로는 있지만 눈에는 보이지 않는 걸 복소수로 표현하니까 아다리가 맞아떨어져서 연산이 되는게 있었다. z = a + bi i의 제곱은 -1 i는 허수다. 복소수는 실수부와 허수부로 표현한다. 켤레 복소수를 곱하면 원래 복소수의 절대값(또는 크기)의 제곱과 같다. 이걸 어디에 쓰는 걸까? 복소수를 이용해 곱했더니 회전이 일어났다는 거를 발견한 것이다. 이 회전을 이용해서 3D에서도 이용하면 되지 않을까 a+bi가 2차원을 나타낸다면 3차원은 a+bi+cj+dk 이런 느낌의 허수를 섞어 만들면 3D에서도 회전값을 표현할 수 있는 걸 오랜 연구 끝에 발견했다. 그게 Quaternion의 개념이다. https://www.songho.ca/math/quaternion/.. DirectX 2024. 3. 20. 71_인스턴싱_Scene 구조 정리 정리를 한다. void RenderDemo::Update() { _camera->Update(); RENDER->Update(); { LightDesc lightDesc; lightDesc.ambient = Vec4(0.4f); lightDesc.diffuse = Vec4(1.f); lightDesc.specular = Vec4(0.1f); lightDesc.direction = Vec3(1.f, 0.f, 1.f); RENDER->PushLightData(lightDesc); } // INSTANCING INSTANCING->Render(_objs); } 이런 부분을 Scene이라는 개념으로 관리해서 SceneManager를 만들고 Scnee이 실행되고 있는 게임 화면이라 인지하는 경우가 많은데 언리얼에.. DirectX 2024. 3. 20. 70_인스턴싱_인스턴싱 통합 통합해서 관리하는 걸 만들고 SceneManager랑 나머지 Component 안 만든 거 정리를 하면서 진행해 본다. 1. RenderDemo 클래스를 만들고 세팅하기 AnimInstancingDemo클래스를 복붙 해서 이름을 RenderDemo로 한다. Client/Game 필터에 넣는다. 코드를 알맞게 수정한다. _shader = make_shared(L"23. RenderDemo.fx"); 목적은 결국 애니메이션이건 일반 모델이건 메쉬건 상관없이 통합해서 관리할 수 있게끔 만들어 줘야 된다가 미션이다. Main에도 RenderDemo를 세팅한다. #include "RenderDemo.h" desc.app = make_shared(); // 실행 단위 Engine 쪽 코드는 거의 건드릴 게 없고, .. DirectX 2024. 3. 20. 69_인스턴싱_ModelAnimation(인스턴싱) 1. AnimInstancingDemo 클래스 생성하고 세팅하기 ModelInstancingDemo 클래스를 복붙하고 이름을 AnimInstancingDemo라고 한다. 코드를 맞게 수정한다. _shader = make_shared(L"22. AnimlInstancingDemo.fx"); Main에 가서도 세팅한다. #include "AnimInstancingDemo.h" desc.app = make_shared(); // 실행 단위 Client를 빌드한다. AssimpTool의 AniimationDemo의 코드를 참고해 볼 수 있다. AnimationDemo::CreateKachujin을 보면 m1->ReadModel(L"Kachujin/Kachujin"); m1->ReadMaterial(L"Kachu.. DirectX 2024. 3. 18. 68_인스턴싱_ModelRenderer(인스턴싱) Mesh 다음에 Model, Animation을 작업했다. 그 순서대로 작업을 해 볼 것이다. 1. ModelInstancingDemo 클래스 만들기 MeshInstancingDemo를 복붙 해서 ModelInstancingDemo라고 하고 Client/Game필터에 넣는다. 큐브나 구 같은 걸 메쉬라고 했었고, 모델 같은 경우는 fbx파일을 로드해서 힘들게 작업했던 애들을 모델이라고 볼 수 있다. 타워로 실습을 해볼 예정이다. 타워가 정상적으로 보이게끔 하는 게 목표다. ModelInstacnigDemo에 맞게 코드를 수정한다. _shader = make_shared(L"21. ModelInstancingDemo.fx"); 렌더링하는 코드는 크게 바뀌지 않는다. 원래 AssimpTool의 StaticM.. DirectX 2024. 3. 16. 67_인스턴싱_MeshRenderer(인스턴싱) 인스턴싱 코드를 만들어 봤는데 그다음은 지금까지 만든 프레임워크랑 통합을 해서 관리할 수 있게끔 하나씩 만들어 보는 게 목표라고 보면 된다. InstancingDemo 클래스를 Game 필터로 옮기고 Week2, Week3필터는 삭제한다. 원래 작업하던 방식이 메쉬를 먼저 만들어 놨었다. MeshRenderer 다음에 ModelRenderer 그 다음에 Animator를 만들어 놨으니까 그 순서대로 하나씩 수정을 해본다. 하나씩 만들어 본 다음에 동시에 관리할 수 있게 통합을 하는게 목표다. 1. MeshInstancingDemo 클래스와 20. MeshInstancingDemo.fx를 만들고 세팅하기 InstancingDemo클래스를 복붙하고 이름을 MeshInstancingDemo라고 한다. Clie.. DirectX 2024. 3. 14. 66_인스턴싱_인스턴싱과 드로우콜 1. 드로우콜이란 상용엔진을 사용했다면 드로우콜이라는 용어가 많이 등장한다. 드로우콜이 어떤 의미인지 파악을 할 수 있어야 한다. 유니티엔진에서 보면 Stats를 눌러 보면 Batches: 2라고 되어 있는데 2가 드로우콜이다. 몇 번 만에 그리는지라고 생각하면 된다. DX11로 이것 저것 물체를 그렸는데 지금까지는 물체를 하나 그릴 때 마다 부품을 넣어서 그 부품이 실제로 물체를 그리는 데까지 코드를 만들어 놨다. 큐브를 늘리면 Batches가 늘어난다. 물체가 여러개로 늘어나는데 최적화를 하지 않으면 batches가 늘어난다. 이런 거를 최적화 하는 부분이 있다. Project setting에 가서 Player에 Dynamic Batching을 사용할지 옵션이 있는데 이걸 켜보면 된다. 그러면 Bat.. DirectX 2024. 3. 12. 이전 1 2 3 4 5 ··· 15 다음