목록DirectX12 (26)
For me
FBXLoader.h 더보기 #pragma once struct FbxMaterialInfo { Vec4diffuse; Vec4ambient; Vec4specular; wstringname; wstringdiffuseTexName; wstringnormalTexName; wstringspecularTexName; }; struct BoneWeight { using Pair = pair; vector boneWeights; void AddWeights(uint32 index, double weight) { if (weight 4) boneWeights.pop_back(); } void Normalize() { double sum = 0.f; std::for_each(boneWeights.begin(), b..
Picking = Raycasting 좌표 파이프라인을 반대로 다시 돌아가면 된다. Actual Viewport → Normalized Coordination Space → View Space View Space에서 Picking을 진행하게 됨 Ray와 물체가 충돌하는지에 대해서 확인이 필요함 BaseCollider 더보기 #pragma once #include "Component.h" enum class ColliderType { Sphere, }; class BaseCollider : public Component { public: BaseCollider(ColliderType colliderType); virtual ~BaseCollider(); virtual bool Intersects(Vec4 ..
Terrain - 지형 Mesh는 수많은 삼각형으로 이루어져 있는데, Terrian의 경사가 있으면 있을수록 더 많은 삼각형이 생김. => Tessellation 을 사용하여 먼거리에 있는 지형은 삼각형의 개수를 줄임 terrain texture, height texture을 사용 Resource.cpp z ... 2 1 2 ... x z * x개 만큼의 표 정점 개수는 이것보다 한개가 더 많음 (for문에서 +1 하는 이유) 1. 표를 돌며 정점을 하나씩 만드는 과정 2. 임의의 점에 대해서 삼각형을 만듬 (삼각형 두개로 이루어진 사각형으로 이루어짐) 3. 텍스쳐를 불러와 추가 더보기 shared_ptr Resources::LoadTerrainMesh(int32 sizeX, int32 sizeZ) { ..

Tessellation : 새로운 정점 생성 , 지형 과 같은 거시적인 단위 Hull Shader Tessllator Domain Shader VertexShader 이후에 진행되는 과정 Tesellation 이란? Option 의 일부로 안해도 문제는 발생하지 않음. Geometry Shader와 비슷하게 정점을 추가하는 과정 Gemoetry Shader은 작은 규모의 용도 Tesellation은 큰 규모의 용도 동적 LOD(Level Of Detail) Mesh를 여러개 준비해 바꾸는 방법으로, 카메라에 멀어질 수록 LOD에 따라 Polygon 개수를 줄여 최적화 하는 기법 Terrain 에 적용하면 좋음! 개발자가 설정 해놓는 것 - Hull Shader, Domain Shader Control P..

같은 물체를 다수를 그려야할 때 DrawCall은 성능을 많이 잡아먹는데, Setting 하는 부분이 많은 부분을 굉장한 부하를 주기 때문 => Instancing으로 묶어 진행한다면? 완전히 똑같은 물체를 만들 때 Instancing으로 묶어 만들 수 있음 SV_InstanceID를 통해 추적, 그거에 따른 배치 정보를 활용 Particle은 배치정보를 어떻게 기입? => Particle 같은 경우는 Compute Shader을 사용해서 t_register에 넣기위해 SturcturedBuffer을 사용 Instancing 같은 경우는? => Rendering을 할 때 IASetVertexBuffer을 이용하는데, 여러개의 슬롯을 사용함 InstancingBuffer.h 더보기 #pragma once ..

Particle System 위의 사진은 Unity Particle System인데, 파티클 시스템(particle system)은 게임 물리학, 모션 그래픽, 컴퓨터 그래픽스의 기술로, 전통적인 렌더링 기법으로는 재현하기 어려운 특정 종류의 Fuzzy 현상을 시뮬레이션하기 위해 많은 미세 스프라이트, 3D 모델 또는 기타 그래픽 객체를 사용 몇백 몇천개의 오브젝트를 직접 생성하면 프로그램에 엄청난 부하를 주게됨. 따라서 constant Buffer을 사용하지 않음. ( 사이즈가 정해져 있기 때문 ) => StructuredBuffer 을 사용 SturcturedBuffer을 사용하면서 GPU에게 명령, CPU와 GPU의 긴 통신비용을 없앨 수 있음. (VRAM 과 GPU) Compute Shader 사..

GPU 에게 일감을 넘기도록 하는 방법 대량 병렬 GPGPU 알고리즘 또는 게임 렌더링의 일부를 가속시키기 위해 사용할 수 있음 Effect, Particle System, Instancing... Why GPU? Compute Shader 더보기 #ifndef _COMPUTE_FX_ #define _COMPUTE_FX_ #include "params.fx" // Shader 코드 내부에서 읽을 수 있음 // 내용 수정도 가능 // 지금까지 Readonly로 사용함 RWTexture2D g_rwtex_0 : register(u0); // 쓰레드 그룹당 쓰레드 개수 // max : 1024 (CS_5.0) // - 하나의 쓰레드 그룹은 하나의 다중처리기에서 실행 [numthreads(1024, 1, 1)]..

Forward Rendering 1개의 Frame - 여러개의 Drawcall Drawcall은 VertexShader, Geometry Shader, Fragment Shader 순으로 연산 수행하여 최종 Frame 생성 하나의 Drawcall 계산할 때 마다 Light 연산을 수행 하여 오브젝트들의 색상을 결정 연산이 완료되면, Render Target에 업데이트 Deferred Rendering 필요한 정보들을 전부 텍스쳐에 보존하여 그려주게 됨. Forward에서는 물체를 그릴 때 Depth , Normal, Color값이 저장되지 않지만 Deferred는 보존하고 싶은 값들을 저장하여 최종적으로 모든 정보를 합쳐 출력하는 방식을 사용한다. 아래의 사진과 같이, UI로 저장되고 있는 값들을 출력하..

위의 사진과 같이 UI에 RenderTarget을 적용한 결과이다. 마치 CCTV처럼 원하는 곳을 다른 곳에 원하는 곳에 한 화면을 그릴 수 있게 함 RenderBegin - Render - RenderEnd 순으로 진행되고, 가지고 있는 모든 RenderTargetGroup 초기화 - 그림자 - Deferred - Light - Final - Forward 순으로 Render 가 진행된다. RenderTargetGroup.h 더보기 #pragma once #include "Texture.h" enum class RENDER_TARGET_GROUP_TYPE : uint8 { SWAP_CHAIN, // BACK_BUFFER, FRONT_BUFFER SHADOW, // SHADOW G_BUFFER, // P..

직교 투영은 언제 사용하나? League of Legend의 관전모드의 시점이다. 좌, 우 , 하단 맵 등 UI부분들은 사용자에게 직교투영이 되어 움직이지않고 보이게 된다. 이러한 UI는 카메라가 회전한다고 회전하지 않고, 확대한다고 커지지 않는 것처럼, 사용자에게 항상 같은 모습으로 보여주게 된다. UI Camera와 UI Camera 2개의 카메라를 이용한다. 이후, UI는 Layer을 이용하여 구분한다. (Unity의 Water, UI, Player etc.. 와 같다) layerIndex 를 추출하여, SetCullingMaskLayerOnOff 메소드를 불러들여, 원하는 layer을 끄거나 킬 수 있다. SceneManager.cpp Camera는 UI를 안찍고, UI Camera는 UI만 찍게..