본문 바로가기

전체 글330

28. Instancing 붓 그리기로 치면, 전체적인 그림을 알고 있으면 빨간 붓을 들었을 때 이 참에 빨간 색이 들어간 모든 부분을 칠하는 것 이전에 DrawIndexedInstanced 함수에서 인스턴싱하는 방법과 별개로 IASetVertexBuffers에 여러 개의 버텍스 버퍼를 넣어줄 수 있다. 인스턴싱이란 하나의 정점 정보로 여러개의 물체를 그린다는 것. 어떤 물체가 인덱스 버퍼, 버텍스 버퍼가 같고, 머테리얼조차 같아서 동일한 쉐이더를 사용한다면 그 물체는 위치값만 바꿔서 여러 개로 찍어낼 수 있다. InstancingBuffer 클래스 - 헤더에 구조체 InstancingParams를 선언하고, 이 구조체의 멤버는 월드행렬, 월드뷰행렬, 월드뷰프로젝션행렬이 있다. - Init 함수에서 구조체의 개수를 받아서 Inst.. 2023. 2. 14.
27. Particle System_2 Particle System_1에서 쉐이더에서 구현한 내용을 cpp 코드에서도 구현하기 위해 2개의 클래스를 추가 1. StructuredBuffer - Constant Buffer와 마찬가지로 Graphics 기능을 지원하기 위해 만들어진 클래스 - Engine에서 이 클래스의 포인터를 소유하고 Get 함수로 접근할 수 있게 빼두었다. - Init 함수에서 버퍼의 크기와 개수를 받고 SRV, UAV 뷰를 만든다. - 멤버함수로 SRV, UAV의 내용을 세팅해주는 Set 함수를 제공한다. - 여기서 세팅해주는 SRV, UAV는 Compute 전용 DescriptorHeap에 전달된다. 2. Particle System - Component로 GameObject에 연결되어 로직이 돌아간다 - 내부적으로 S.. 2023. 2. 14.
26. Particle System_1 파티클 시스템은 화면에 떠다니는 다수의 개체를 표현할 때 사용하는 기술이다. 그리고 그 개체 하나 하나를 파티클이라고 한다. - 이런 물방울들을 화면에 표현할 때 개체 하나 하나를 렌더링파이프라인을 거쳐 출력하면 성능이 매우 떨어질 것이다. (몇천 몇만개가 되므로) - 이번 주제는 이런 파티클들을 컴퓨트 쉐이더를 통해 어떻게 표현하는지에 대한 내용이다. 인스턴싱(Instancing) - 동일한 객체를 한 화면에 여러 개 등장시킬 때 사용하는 기술 - 이 기술은 지금도 사용하고 있었다. - CommandList의 DrawIndexedInstanced 함수는 이런 인스턴싱에 관여하며 2번째 인자가 한번에 그릴 개체의 개수를 의미한다. struct Particle { float3 worldPos; float .. 2023. 2. 13.
25. Compute Shader CPU와 GPU의 핵심적인 차이는 코어의 갯수이다. CPU는 코어가 몇 개 안되지만 GPU는 엄청 많음 (몇 천개 단위..) 하지만 코어 하나의 성능은 CPU가 더 똑똑하다 CPU는 이것 저것 많은 일들을 처리해야 하기 때문 (일당백) 모든 일감이 독립적으로 실행되는 경우 예를 들면 이전의 작업과 지금의 작업이 아무 관련이 없어서 병렬로 실행되어도 아무 문제 없는 경우 GPU에게 단순 작업을 떠넘길 수 있다. UAV(Unordered Access View) - u0~un이 컴퓨트쉐이더에서 사용하는 레지스터이다. 쉐이더코드에서 제공하는 Texture중 RWTexture2D라는 텍스쳐가 있는데, RW는 Read/Write를 의미하며 특이하게도 Write가 가능한 텍스쳐다. 이 텍스쳐는 픽셀 하나하나당 일감을.. 2023. 2. 12.