XRManet / Engine

2 stars 0 forks source link

Shader build system #10

Open sixzone11 opened 3 years ago

sixzone11 commented 3 years ago

Shader build system

Requirements

쉐이더 시스템에 요구되는 사항들은 다음과 같습니다.

  1. 어떤 종류의 쉐이더를 사용할지에 대한 것은 렌더러 측에서 결정토록 합니다.
  2. 소스 쉐이더를 어떤 언어로 작성할지, 어떤 컴파일러를 사용해서 IL로 컴파일할지도 자유로워야 합니다.
  3. 추후 고려될지 모를 Interoperability를 염두에 두어, 여러 쉐이더 시스템이 병치될 수 있어야 합니다. 이 경우, 렌더러 모듈도 병치될 것이 고려되었을 것입니다.
  4. 오프라인 빌드를 주로 사용하되, 런타임 빌드가 용이해야 합니다.

Components

렌더러 별 호응

OpenGL System Attachable

XRCompilerGLSL

4.1 이후와 그 이전이 차이가 상당합니다.

4.0 이전은 다음의 API들을 사용하여 runtime build만이 가능합니다.

이와 같이 빌드한 program을 다음 인터페이스를 통해 context에서 사용합니다.

4.1 이후는 추가적으로 program으로부터 binary를 추출하는 것이 가능하다. 단, compatible object가 아니라 현재 시스템에 한정적인 바이너리가 추출되는 한계가 있다. 한정적으로나마 캐싱 가능하다는 이점이 있으므로 사용하지 않을 이유는 없을 것이다.

또한 4.1 이후엔 program pipeline이라는 개체가 추가되는데, program에 각 stage마다 attach된 shader들을 program pipeline에서 골라서 마치 하나의 program인 것처럼 사용하는 기능입니다.

위 둘을 활용하면, 개별 shader object마다 program object로 만들어서 이를 추출하는 방법으로 개별 쉐이더 바이너리를 저장하고, 조직할 수 있습니다. 즉, offline binary compiler를 사용할 수 있습니다.

glUseProgram()을 통해 설정된 current program은 glUniform*() 계열의 함수를 통해 리소스를 바인딩할 수 있습니다. pipeline program은 그와 달리 다음의 함수를 설정하여 pipeline program 내에 어떤 program이 바인딩 함수의 대상이 되도록 할지 결정할 수 있습니다.

물론, 그 대신 직접 리소스를 바인딩할 프로그램을 명시하는 glProgramUniform*() 을 사용하는 것이 더욱 직접적이고 명쾌합니다.

실사용에 관해선 다음 링크에서 참조할 수 있습니다. https://github.com/g-truc/ogl-samples/blob/master/samples/gl-410-program-binary.cpp

XRCompilerGLSpirV

SpirV를 사용하여 shader를 컴파일하면 여러 시스템에서 공용으로 사용 가능한 intermediate language 수준의 바이너리가 추출됩니다. 이를 최종 장치에서 컴파일하도록 하고난 이후의 program으로 빌드하는 것은 이전과 동일한 처리를 거칩니다.

호환 가능한 shader binary를 추출하고, 장치 종속적인 program 바이너리를 별도로 추출할 수 있으므로 배포 측면에서 좀 더 용이합니다.

Vulkan System Attachable

XRCompilerVKSpirV