为什么我们不将主文件和着色器文件代码放在一起?
为什么我们必须分开它们?
我们应该这样做吗?
为了让程序运行更快或任何其他原因?
答案 0 :(得分:2)
问题存在于多个层面。
OpenGL没有一致的字节码格式:简单地说,不能保证如果在一台计算机上创建着色器的编译字节码,那么相同的编译形式将在另一台计算机上运行,即使他们拥有相同的GPU。由于驱动程序更新和其他硬件更改,还无法保证字节码可以在具有相同GPU的同一台计算机上运行!这是Vulkan通过引入SPIR-V来解决的问题,应该适用于任何符合要求的Vulkan实现。但是OpenGL没有与SPIR-V相当的东西。
编辑:为OpenGL引入了一个扩展,以支持SPIR-V。但它还不是核心,而且还有本文中列举的其他两个问题。
许多程序员找到解决这些问题的解决方法和解决方案。在专业设置中,着色器源代码通常被压缩并存储在资源文件中,与存储模型,纹理,声音等的方式相同。所以很多时候这个问题被最小化或抽象掉了。
但从一般意义上讲,这个问题很少有实用,通用解决方案。
答案 1 :(得分:1)
为什么我们不将主文件和着色器文件代码放在一起?
什么是“主”文件以及什么是“着色器”文件?
为什么我们必须分开它们?
我们没有。将着色器源字符串烘焙到可执行文件中是完全可能的。 GLSL着色器代码也很有可能在运行时生成(我开发的几个库/中间件就是这样做的)
我们应该这样做吗?
主要是为了方便起见。单独的文件更易于修改或更新。哎呀,你甚至可以在它上面添加一个文件系统监视器,以便在它发生变化时获得通知,并在它完成时重新编译着色器。这大大缩短了开发周期。
为了让程序运行更快或任何其他原因?
实际上,这只是一个方便的问题。 OpenGL并不关心它。所有OpenGL都希望看到一些有效的GLSL着色器源代码,而且它是一个快乐的露营者。