게임프로그래밍고급 11주차 - Compute Shader
실습 진행.
빛의 종류
자연광 Ambient, 분산광 Diffuse, 반사광 Specular, 환경광 Global illumination
invironment mapping
Rendering Pipeline
Local > World > View > Projection
World space
- 모든 연산은 특별한 경우를 제외하고는 월드 스페이스에서 이루어진다.
- 벡터 공간의 연산을 해도 대부분은 월드 스페이스에서 진행한다.
- 버텍스의 위치,
Texture mapping file를 활용하기 위해서 TEXTURE COORDINATE 구조체를 사용한다.
두 벡터의 크기가 1일 경우 두 벡터의 내적은 cosθ와 같다.
이 과정을 통해 두 벡터의 사이값을 알 수 있다.
노말 값과 라이트 디렉션의 사잇 값이 θ라고 했을 때, 코사인 θ값(두 벡터의 내적)이 밝기가 된다.
카메라가 바라보는 노말 값.
정반사를 하는 벡터를 구하면 HLSL 함수가 정제를 한다. (리프렉션)
스카이 박스의 어떤 부분이 카메라 안에 들어오는지. 뷰 벡터의 리프렉션 벡터가 반사벡터로 들어온다.
texcube : 정식 HLSL 코드. uv값을 준다.
tex3D : 텍스쳐의 uv값을 제공 하고, 색을 알려 줌.
*Unity에서는 사용되지 않음.
실습 진행.
지난시간 복습
Compute Shader
CPU -> GPU : Draw Call
Unity Compute Shader
- GPU를 이용한 병렬 처리를 통해서 동시에 많은 작업을 고속으로 처리하기 위해서 사용하는 Shader.
- GPU를 이용해서 작업이 이루어지지만, 기타 다른 Shader와 다르게 렌더링 파이프라인을 이용하는 측면에서 다른 Shader와 차이가 존재한다.
- GPGPU(General Purpose GPU, 범용 GPU 계산) : GPU를 CPU처럼 쓸 수 있겠는가 하는 개념.
- Unity의 Compute Shader (GPGPU 기술)와 유사한 개념 : CUDA, OpenCL, DirectCompute 등 존재.
- 기존의 Shader와 유사하게 프로젝트의 Asset 파일로 존재
- Create > Shader > Compute Shader를 통해서 생성
- 파일 확장자 .compute
- DirectX11 스타일의 HLSL 언어로 구현
Kernel, Thread, Group
Kernel
GPU에서 실행되는 하나의 프로세스, 코드상에서는 하나의 함수.
- 최소 하나의 Kernel 포함 필수
- Kernel 사용 시 #pragma kernel 행 추가
Thread
커널을 실행하는 단위, 하나의 Thread가 하나의 Kernel을 실행
Group
동시에 Thread들을 실행하는 단위
- 동시에 Thread들을 실행하는 단위
- 같은 Group 안에 속한 Thread들은 Group Thread라 칭함.
- Compute Shader는 여러 개의 Group들도 동시에 실행 가능.
- Group은 Thread처럼 3차원으로 그룹 생성 가능.
Thread, Group의 한계
Kernel 함수 정의
- GPU에서 실행되는 하나의 프로세스..
- 코드상에서는 하나의 함수로 구현.
- #pragme kernel를 통해서 커널로 취급하는 함수 선언.
- #pragme kernel로 정의 한 순서대로 0부터 차례대로 인덱스 부여.
데이터 연동을 위한 Buffer와 변수 정의
- Compute Shader를 통해서 실행 결과를 저장
- CPU와 GPU의 데이터를 서로 공유
- RWStructuredBuffer<T> : 읽고 쓰기 버퍼
- StructuredBuffer<T> : 읽기 전용 버퍼
- CPU와 GPU의 변수 값 연동을 위해서 변수 선언이 필요하다.
RWStructuredBuffer<int> intBuffer;
Kernel 함수 실행 Thread 수 지정
- numthread 속성 : 3차원, Attribute를 이용해서 커널 함수를 실행하는 thread 수를 지정.
- thread 수는 (x, y, z)를 이용한 3차원으로 지정
Kernel 함수 구현
Kernel 함수 파라미터에 대한 설정 제약
- 함수 파라미터는 compute shader semantics중 선택 필수
- 정의 되지 않는 임의의 semantics는 사용 불가
- 커널에서 사용할 수 있는 파라미터는 Unity Compute Shader에 정의된 semeantics 유형의 인수들만 가능하다.
- SV_GroupID : [unit3] 현재 커널을 실행하는 스레드가 속한 Group의 인덱스 (x, y, z)
- SV_GroupThreadID : [uint3] Group내의 개별 Thread의 인덱스 (x, y, z)
- SV_GroupIndex : [uint] SV_GroupThreadID를 1차원으로 표현한 인덱스 값
- SV_DispatchThreadID : [uint3] SV_GroupID * numthreads와 GroupThreadID의 합
Kernel 함수 분석
Kernel A 함수 구현
- Sample에서 정의한 버퍼에 Thread들이 자신의 Index를 병렬로 기록하는 작업을 진행하는 함수 정의
- GroupThreadID를 통해서 현재 실행되고 있는 thread가 속한 그룹 내에서 인덱스 확인 가능
Kernel B 함수 구현
- KernelFunction_A에 의해 intBuffer가 0~3 순서대로 주어짐.
- KernelFunction_B를 실행한 후에 값이 1~4로 바뀌어짐.
Script를 통한 Compute Shader
Compute Shader 구현
- Compute Shader 및 Kernel, 저장 버퍼를 위한 변수 선언
- 실행하고 있는 Kernel의 인덱스 확인
- Compute Shader의 실행 결과 저장 버퍼 생성 및 처리
- Compute Shader와 Buffer 연결 (setBuffer)