跳转至

项目以后打算支持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相当于“中间表示语言
    1. 可以将写好的glsl、hlsl转换为SPIR-V
    2. 也可以将SPIR-V转换为glsl、hlsl。 使得可以完成只写次shader,自动生成各种不同版本的shader语言
  • SPIR-V什么工作方式:(可能我理解错了了)

    将vulkan的glsl用SPIR-V编译成SPIR-V二进制文件,然后可以用SPIR-V的交叉编译这个二进制文件可以成hlsl、metal,以及兼容OpenGL的glsl。

  • 实现过程中的重要功能 使用SPIR-V加入着色器缓存功能,不用每次都编译着色器,节省时间