개발 노트 Vulkan Shader 2017/01/12 02:04 by cagetu

Vulkan은 SPIR-V 라는 셰이더 포멧을 사용한다. Spir-v에 대해서는 아직 공부를 하는 중이라 자세한 설명을 하지는 않는다.

SPIR-V는 빌드된 바이너리 형태인데, 일반적으로 glsl로 코드를 작성해서 glslangvalidator 라는 변환 툴을 이용해서 spir-v 파일로 변환한다.

glslangvalidator -V -H default.vert -o default.vert.spv > default.vert.spv.txt
glslangvalidator -V -H default.frag -o default.frag.spv > default.frag.spv.txt

재미있는 것은 지금부터인데, Cross Platform Shaders 처럼 유니티와 언리얼 엔진과 같이 크로스 플랫폼으로 셰이더를 처리하는 녀석들에서는 과연 Vulkan Shader를 어떻게 처리하는가? 이다.

언리얼을 보면 Material Editor에서 노드 그래프를 연결해서 셰이더를 만든다. 그럼 HLSL 코드로 셰이더가 만들어진다. 그리고 이 HLSL 코드를 가지고 플랫폼에 따라 glsl 코드로 변환하여 사용하게 된다. (hlsl2glsl, glsloptimizer)

그럼 Vulkan은 어떻게 될까? HLSL -> GLSL -> (glslangvalidator) -> spirv 코드로 변환되게 된다. 결국 한번의 코드를 이용해서 최종 플랫폼의 셰이더 코드를 자동으로 만들어내는 것이다.

물론 마지막에 기기에 들어갈 때에는 spirv 셰이더 코드만 있으면 된다. 일반적으로 gles와 vulkan을 동시에 사용하기도 하니까, gles shader 코드와 vulkan shader 코드 (spv)가 같이 포함되어 있되록 할 것 같다.

셰이더컴파일 시스템에 대해서는 언리얼이나 유니티 모두 굉장히 시스템이 잘 만들어져 있고 이제는 거의 완성형에 가깝다는 생각이 든다. (이게 여기까지 오는데 엄청난 시간이 걸렸다는 것을 많은 사람들이 모른다.) 공부가 참 많이 된다. 기초가 되는 mesa 라이브러리를 공부해서 한 번의 코드로 다른 플랫폼 코드를 뽑아내면 좋을 것 같은데, 만만치 않다 ;; 나중에 관심 있는 분들에게 도움을 요청해서 한번 같이 해보면 좋을 것 같다.

일단 손으로 glsl 4.5 버전을 작성하고, 그걸로 spv를 만들어내는 것으로 출발해보자!


덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu