셰이더 내부에서 처리하던 상수 값 사이의 연산을 CPU 에서 처리하게 하면, GPU Instruction 이 줄어들어 셰이더의 GPU 실행 속도가 빨라질 수 있다.
코드 예시:
float GetDepthSlice (float SceneDepth)
{
float MinDepth = ViewUniformBuffer.DepthStartDistance;
float MaxDepth = ViewUniformBuffer.DepthScale * 1000.0f;
float DepthSlice = (SceneDepth - MinDepth) / (MaxDepth - MinDepth);
return saturate(DepthSlice);
}
위 함수에서, SceneDepth 를 제외한 나머지 값들은 모두 UniformBuffer 에서 읽어오는 값이다.
GPU 의 모든 스레드가 동일한 값을 읽어 사용하기 때문에 MinDepth 와 MaxDepth 는 상수이다.
최적화할 수 있는 부분은 DepthSlice 를 계산하는 곳이다.
SceneDepth 를 제외한 나머지 상수 부분 연산을 CPU 로 옮길 수 있다.
상수 부분 연산을 CPU 로 옮기면 셰이더 코드를 A * x + B 형태로 바꿀 수 있다.
기존 코드의 수식을 그대로 컴파일 하면 3개 이상의 GPU Instruction 이 필요하다.
하지만 A * x + B 형태로 수식을 맞추면 1개의 GPU instruction 만 사용해서 컴파일 된다.
실행시키는 GPU Instruction 의 수가 적어지므로, 셰이더의 GPU 실행 속도도 빨라진다.
'Graphics' 카테고리의 다른 글
[Renderer] Graphics Pipeline (Rendering Pipeline) / RenderPass / Rendering Path (0) | 2022.02.02 |
---|---|
[Vector] 두 벡터 사이의 각도 구하기 (내적/외적) (1) | 2022.02.01 |