着色器编译
Contents
大致从UE4.25开始,虚幻引擎开始逐步将Shader交叉编译器从HLSLCC(基于Mesa3d的方案)替换为DXC(Shader Conductor)
为什么说DXC是未来?
-
HLSLCC停止维护 & 输出Shader可读性差
-
DXC 优化Pass提升性能(减少寄存器等) 移动平台使用下面的工具链进行交叉编译:
-
HLSL源码经过mcpp,填充UnfiormStruct数据,并将引用的HLSL代码合并为单HLSL文件
-
DXC(DirectX Shader Compiler)将HLSL编译为 SPIRV格式
-
SPIRV经过 SPIRV-OPT 进行优化(Performance 、Code Size)
-
SPIRV经过 SPIRV-Cross 交叉编译为 ESSL、MSL 源码 虚幻引擎 着色器交叉编译 - 腾讯游戏知识库 - KM平台
Opengl ES 编译
与OpenGL ES中的其他调用相比,编译和链接着色器是一个耗时的过程。它的代价较高。建议在初始化过程中加载和编译着色器,然后在渲染阶段通过调用glUseProgram根据需要在着色器之间进行切换。
对于OpenGL ES 2.0、ES 3.0和ES 3.1上下文,建议使用二进制大对象(blob)。在编译并链接程序对象后,可以使用以下其中之一的函数检索二进制表示或blob:
- 使用glGetProgramBinaryOES,如果在OpenGL ES 2.0上下文中,且GL_OES_get_program_binary扩展可用
- 使用glGetProgramBinary,如果在OpenGL ES 3.0或3.1上下文中(核心功能).
然后可以将blob保存到持久存储器中。下次启动应用程序时,无需重新编译和链接着色器。相反,直接从持久存储器中读取blob,并使用glProgramBinaryOES或glProgramBinary将其加载到程序对象中。这可以显著加快应用程序启动时间。