목록Graphics (15)
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 클래스에서 시작한다. 앞서 언급했던 광원부터 어떻게 구성되어있는지 ..
Framebuffer를 만들때는 Renderpass를 요구하는데, 그렇다면 Framebuffer는 렌더패스에 종속적인가?서로 다른 렌더패스가 같은 Framebuffer를 사용할 수 없는가? 라는 의문이 들어 검색을 좀 해보았다. 일단 Vulkan Specification을 봤을 때, Framebuffer나 PipelineState같이 렌더패스를 사용하여 생성되는 객체들은Renderpass Compability를 만족하면 공유해서 사용할 수 있다고 한다.재사용이 가능한 것은 알겠는데, Framebuffer를 여러 렌더 패스가 공유하게 하면 얼마나 성능 향상을 기대할 수 있을까도 궁금해졌다. https://www.reddit.com/r/vulkan/comments/bzee0u/how_important_is_..

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 ..

테스트를 위해 주어진 개수만큼 오브젝트를 범위내 랜덤 위치, 랜덤 회전값으로 배치시키도록 구성했다.쉐이더는 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 평균..
소량의 데이터를 빠르게 전달할 때 사용한다. 변환 행렬 등을 쉐이더로 넘길 때도 사용할 수 있다.모든 쉐이더 단계에 데이터를 전송할 수 있다.Command Buffer 자체에 저장되기 때문에 Command Buffer를 다시 만들지 않는 한 변경할 수 없다.vkCmdPushConstants() 함수를 사용하여 데이터를 Command Buffer에 입력한다.쉐이더에서는 다음과 같이 사용한다.layout( push_constant ) uniform constants{ vec4 data; mat4 render_matrix;} PushConstants;
Fragment Shader (Direct X에서는 Pixel Shader) 이후 Depth test를 수행하여 Depth test에 실패한 Fragment를 폐기하는 과정을 거치는데, 이를 Fragment Shader 이전으로 앞당겨 그려지지 않을 Fragment에 대한 불필요한 Fragment Shader 연산을 하지 않도록 할 수 있다. 장점- 불필요한 Fragment Shader 연산을 줄일 수 있다.- 따라서 GPU 부하가 감소한다. 단점- Fragment Shader가 깊이값을 변경하는 경우에는 의도대로 렌더링되지 않을 수 있다.- 반투명 오브젝트가 Depth test에 실패하여 렌더링되지 않을 수 있다.- 사용하는 Fragment shader의 연산이 가벼운 경우 Early depth tes..

Primary Command Buffer- Queue에 직접 제출할 수 있다.- 여러개의 Secondary Command Buffer를 호출할 수 있다.- Seconary Command Buffer와 달리 Render Pass 내부에서 호출되어야 한다는 제약이 없다.Secondary Command Buffer- Queue에 직접 제출할 수 없다.- Render Pass 내부에서만 호출될 수 있다.- Primary Command Buffer에서 Secondary Command Buffer를 호출하여 간접적으로 Queue에 제출할 수 있다.- 다른 Primary Command Buffer를 호출할 수 없다.- 여러 Primary Command Buffer에서 재사용이 가능하다.- Primary Command..

타원은 프로그래밍 가능한 Stage이고, 사각형은 프로그래밍 할 수 없는 고정 Stage이다. Tessellator Stage와 Rasterizer Stage, Output-Merger Stage는 프로그래머가 임의로 설정할 수 없다. Hull Shader Stage, Tessellator Stage, Domain Shader Stage는 DX11에서 새로 추가된, 하드웨어 테셀레이션을 위한 Stage이다. ( 관련 포스트: https://emacser.tistory.com/23 ) pipeline initialization 시에 Hull shader와 domain shader를 설정하지 않으면 테셀레이션도 수행되지 않는다. 이미지 출처 그래픽 파이프라인 - Win32 apps 이 섹션에서는 Direct..