목록분류 전체보기 (71)
Visual Studio
많은 DX12 예제에서 버퍼 등의 리소스를 생성할 때 ID3D12Device::CreateCommittedResource() 함수를 사용한다. https://learn.microsoft.com/ko-kr/windows/win32/api/d3d12/nf-d3d12-id3d12device-createcommittedresource ID3D12Device::CreateCommittedResource(d3d12.h) - Win32 apps힙이 전체 리소스를 포함할 만큼 크고 리소스가 힙에 매핑되도록 리소스와 암시적 힙을 모두 만듭니다.learn.microsoft.comMS 문서를 보면, ID3D12Device::CreateCommittedResource() 함수는 생성될 리소스를 포함하는 크기의 암시적 힙(Im..
Microsoft에서 제공하는 DirectX-Graphics-Samples에서 어떻게 Multithreaded Rendering을 구현했는지 분석해보고자 한다. 먼저 프로젝트를 빌드해서 씬이 어떻게 구성되어 있는지 살펴보자. 방이 하나 있고 그 안에 여러가지의 오브젝트들이 배치되어 있으며, 가운데 문어를 담은 수조(?)가 있는 형태의 씬이다.광원은 여러개이고 수조가 위치한 중심을 기준으로 원을 그리며 돌고 있는 것으로 추정된다.상하좌우 키를 눌러 카메라를 수조를 중심으로 회전시킬 수 있고, Space로 광원 회전을 Play/Pause 할 수 있다. 프로젝트의 흐름은 DXSample을 상속받은 클래스인 D3D12Multithreading 클래스에서 시작한다. 앞서 언급했던 광원부터 어떻게 구성되어있는지 ..
Android로 배포한 언리얼 앱을 Unreal Insights로 분석하는 방법은 두가지가 있다.1. "-tracefile=[파일이름]" 명령 인수로 디바이스 저장소에 .utrace 파일 생성 후 PC로 복사하여 분석하기2. "-tracehost=127.0.0.1" 로 Unreal Insights와 직접 연결하여 분석하기 일단 1번과 2번 모두 adb push를 사용하기 때문에 USB 디버깅이 켜져 있어야 하고, 갤럭시 기준으로 개발자 메뉴에 있는 "OEM 잠금 해제"를 켜줘야 한다. (몇년전에 커스텀롬을 하기 위해 recovery mode로 진입하여 XDA에서 만든 부트로더 잠금 해제 툴로 벽돌을 감수하고 잠금 해제를 했었는데, 이제는 개발자 메뉴에서 딸깍이 가능한 것이 신기했다.) adb는 Andro..
Framebuffer를 만들때는 Renderpass를 요구하는데, 그렇다면 Framebuffer는 렌더패스에 종속적인가?서로 다른 렌더패스가 같은 Framebuffer를 사용할 수 없는가? 라는 의문이 들어 검색을 좀 해보았다. 일단 Vulkan Specification을 봤을 때, Framebuffer나 PipelineState같이 렌더패스를 사용하여 생성되는 객체들은Renderpass Compability를 만족하면 공유해서 사용할 수 있다고 한다.재사용이 가능한 것은 알겠는데, Framebuffer를 여러 렌더 패스가 공유하게 하면 얼마나 성능 향상을 기대할 수 있을까도 궁금해졌다. https://www.reddit.com/r/vulkan/comments/bzee0u/how_important_is_..
https://www.youtube.com/watch?v=uykuLOgfcok&t=900s 유용한 영상이 있어 기록한다. 절반 정도의 분량만 시청했는데 언리얼의 메시 렌더링 파이프라인을 이해하는데 큰 도움이 되었다.요약하자면 SceneProxy에서 같은 버텍스, 머티리얼을 사용하는 메시들의 묶음인 FMeshBatch를 생성하고,MeshPassProcessor에서는 AddMeshBatch 함수를 오버라이드해 FMeshBatch를 MeshDrawCommand로 변환한다.MeshDrawCommand는 Draw Call에 필요한 모든 정보를 가지고 있으며, 예시로 Shader Binding, Vertex Steam, Index Buffer, PSO 캐시 ID 등이 있다.
Vulkan에서 Descriptor를 추가하여 사용할 수 있도록 Texture를 로드하여 준비하는 과정은 다음과 같다. 1. Staging Buffer를 생성한다. (이미지에 픽셀 데이터를 복사하기 위한 임시 버퍼)2. vkMapMemory() 함수로 Staging Buffer의 가상 주소를 포인터에 저장한다.3. memcpy 함수로 이미지를 Staging Buffer의 메모리에 복사한다.4. vkUnmapMemory() 함수로 매핑한 가상 주소를 해제한다.5. Image를 생성한다.6. vkCmdPipelineBarrier() 함수로 이미지의 레이아웃을 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL로 변경한다.7. vkCmdCopyBufferToImage() 함수로 버퍼 안의 데이터..
Geometry Shader를 사용하여 TBN 행렬의 각 요소를 시각화하였다.아래는 사용된 쉐이더 소스코드이다.#version 450struct Light{ vec3 position; vec4 ambient; vec4 diffuse; vec4 specular; vec4 attenuation; float shininess;};layout(std140, binding = 0) uniform TransformBufferObject{ mat4 view; mat4 projection; vec3 cameraPosition;} transformBuffer;layout(location = 0) in vec3 inPosition;layout(location = 1) in ..
실제 게임 플레이시에는 BackBuffer에 직접 씬을 렌더링하지만,Unreal Editor에서 편집중인 월드를 뷰포트에 그릴 때는 BackBuffer에 그리지 않고 BufferedRT라는 텍스쳐를 렌더 타겟으로 하여 그린 후 Slate UI 그릴때 BufferedRT 텍스쳐를 가져와서 뷰포트에 그린다. RenderDoc에서 뜯어본 BufferedRT 텍스쳐
테스트를 위해 주어진 개수만큼 오브젝트를 범위내 랜덤 위치, 랜덤 회전값으로 배치시키도록 구성했다.쉐이더는 Blinn-phong 모델을 구현하였다. Debug, 인스턴스 100000개, Instance Buffer(= Second Vertex Buffer, Binding 1) 평균 25.52 fps Debug, 인스턴스 100000개, Storage Buffer 평균 25.78 fps Debug 모드에서는 Instance Buffer와 Storage Buffer가 큰 차이가 없었다.이제 Release 모드에서 해보자. Release, 인스턴스 100000개, Instance Buffer 평균 60.06 fps Release, 인스턴스 100000개, Storage Buffer 평균..