본문 바로가기

프로그래밍/Shader

Compute Shader_1

현재 Practical Rendering and Computation with Direct3D 11 를 읽는 중이다..
책은 번역본을 사서 읽고 있는데 광이형이 워낙 번역을 정직하게 해놓으셔서 한국어로 보고 있지만 다시 해석을 하는 경우가 있다
또 한글로 번역하는 과정에서 애매하게 설명이 되어 있는 건 원서로 찾아가며 보는 중이다
밑줄치면서 읽기만 하면 머리 속에 기억이 잘 안남아서 나름대로 정리한다

계산 셰이더 (DirectCompute)
 : GPU의 계산 능력을 렌더링 이외의 알고리즘에도 사용하기 위한 좀 더 자연스럽고 유연한 처리 환경을 제공한다
GPU는 병렬로 작동하는 아주 많은 수의 소규모 처리기들로 이루어져 있기 때문에 크게 병렬화할 수 있는 계산에 아주 적합하다

DirectCompute의 장점
 : 렌더링에 쓰이는 것과 정확히 동일한 종류의 자원들을 사용하기 때문에 범용 계산의 결과를 렌더링 연산의 입력으로 직접 사용하는 것이 가능하다. 그래서 렌더링 파이프라인과 계산 파이프라인을 함께 사용하기가 아주 쉽다
 구체적인 알고리즘의 성능을 사용자의 하드웨어에 맞게 높이거나 낮추기가 아주 쉽다
 
계산 셰이더의 스레드 모형은 자원의 병렬 처리를 고유하게 지원하므로, 사용할 수 있는 계산 능력이 더 큰 경우 작업을 추가하는 것이 쉽다

작성한 셰이더를 컴파일한 후 Device Context Interface를 이용해서 그 상태 객체를 계산 셰이더 단계에 연결한다.
리소스, 상수 버퍼, 샘플러를 순서없는 접근 뷰(UAV)를 이용해서 계산 셰이더 단계에 연결할 수 있다.

계산 셰이더는 다른 단계로부터 입력을 받지 않으며, 출력을 다른 단계에 넘겨주지도 않는다.
몇가지 SV Semantic들은 입력 매개변수로 받을 수 있지만, 셰이더에서 사용할 수 있는 특성 형태의 자료에만 국한된다. 그 외의 모든 자료 입출력은 자원을 통해서만 일어난다
 이러한 구조 때문에 하나의 프로그램 안에서 알고리즘을 완결적으로 구현해야 한다.

Kernel기반 처리 시스템을 구현한다.
Kernel은 OS의 커널보다는 이미지 처리를 위한 필터링과 관련된 Math의 Kernel Funcrtion에 더 가깝다
계산 셰이더 프로그램은 한 단위의 작업을 처리하는데 쓰일 커널을 제공한다

모든 스레드가 같은 커널을 실행하므로, 스레드들의 행동을 일일이 동기화하는 대신 원하는 자료를 각자 독립적으로 처리될 자료 항목들로 분할하는 방법을 찾는게 좋다.
하나의 문제를 모든 스레드에서 동일한 방식으로 처리할 작은 문제들로 분할하는 방법을 찾는데 집중하면 된다

작업을 시작할 때 사용할 수 있는 메서드는 ID3D11DeviceContext::Dispatch() 또는 DispatchIndirect()이다.

Dispatch는 부호없는 정수 매개변수 3개를 받는다. 원하는 처리 커널의 실행을 dispatch할 스레드의 그룹의 개수를 결정한다. 이 세 매개변수는 인스턴스화할 스레드 그룹들을 담는 3차원 배열의 x, y, z 차원 크기이다. 유효한 범위는 3개 모두 1 ~ 65535이다.
ex) Dispatch(4, 6, 2)이면 4 * 6 * 2 = 48개의 스레드 그룹들이 만들어진다.

'프로그래밍 > Shader' 카테고리의 다른 글

Adaptation  (0) 2019.03.14
Bloom 이론  (0) 2019.03.13
HDR 이론  (0) 2019.03.06
Compute Shader_3  (0) 2019.02.10
Compute Shader_2  (0) 2019.02.09