项目以后打算支持vulkan,由于vulkan着色器代码也支持glsl语言,但是和Opengl的glsl标准不一。
因为Vulkan中存在OpenGL的不存在的东西(反之亦然),所以着色器代码肯定不同。
vulkan和opengl的glsl对比-以Uniform为例
主要不同¶
在于,opengl支持uniform,vulkan不支持uniform,而是支持uniform缓冲区(push_constant、存储缓冲区)这比OpenGL的glsl更好。
opengl的uniform
uniform mat4 m_transform;
vulkan的uniform缓冲区
layout(std140, binding=2) uniform Transform{
mat4 Transform;
}
Opengl支持的uniform哪里不好¶
场景有很多个物体,这样一个物体调用一次drawcall(不是批处理模式),每个物体需要显示都需要上传摄像机的投影视图矩阵,那么10000个物体就有10000个uniform更新,但其实摄像机的投影视图矩阵在当前帧不变的,这样就会造成性能的下降。
vulkan哪里好¶
vulkan的uniform是在GPU开辟的一块缓冲区,每个物体需要摄像机的投影视图矩阵,只需将这块缓冲区放入投影矩阵的值,然后每个drawcall都去访问这块缓冲区,得到投影视图矩阵就行,性能更好。
此节目的¶
重新写shader系统,使其能支持vulkan和opengl两种glsl
SPIR-V¶
- 介绍SPIR-V
vulkanApi要求以SPIR-V组件的形式提供着色器,而这个SPIR-V相当于“中间表示语言”
- 可以将写好的glsl、hlsl转换为SPIR-V
- 也可以将SPIR-V转换为glsl、hlsl。 使得可以完成只写一次shader,自动生成各种不同版本的shader语言。
-
SPIR-V什么工作方式:(可能我理解错了了)
将vulkan的glsl用SPIR-V编译成SPIR-V二进制文件,然后可以用SPIR-V的交叉编译这个二进制文件可以成hlsl、metal,以及兼容OpenGL的glsl。
-
实现过程中的重要功能 使用SPIR-V加入着色器缓存功能,不用每次都编译着色器,节省时间。