Opengl 有没有办法运行mesa编译器来减小着色器文件的大小?

Opengl 有没有办法运行mesa编译器来减小着色器文件的大小?,opengl,graphics,opengl-es,glsl,Opengl,Graphics,Opengl Es,Glsl,mesa驱动程序作为其编译过程的一部分,会减小glsl着色器文件的大小 有些库(如)使用此事实创建着色器缩小库。我发现的所有缩小库都是弃用软件,因此,除非mesa具有直接获取中间glsl文件的功能,否则我可能必须像这些库那样编辑实际代码 我想知道mesa代码库中是否有一个可执行文件,可以用来执行剥离,而无需编辑代码 我试着阅读mesa官方文档,但我没有发现任何提示: “缩小”与优化不同。通常,该术语用于描述以文本形式接收源文件并删除所有多余空格并用较短的标识符替换所有标识符的过程 严格地说,缩小

mesa驱动程序作为其编译过程的一部分,会减小glsl着色器文件的大小

有些库(如)使用此事实创建着色器缩小库。我发现的所有缩小库都是弃用软件,因此,除非mesa具有直接获取中间glsl文件的功能,否则我可能必须像这些库那样编辑实际代码

我想知道mesa代码库中是否有一个可执行文件,可以用来执行剥离,而无需编辑代码

我试着阅读mesa官方文档,但我没有发现任何提示: “缩小”与优化不同。通常,该术语用于描述以文本形式接收源文件并删除所有多余空格并用较短的标识符替换所有标识符的过程

严格地说,缩小的整个想法是愚蠢的,因为它对性能没有任何影响;它既不影响代码的词法分析,也不影响编译结果。整个缩小涂鸦开始于网页开发,以减少网页资源的大小;完全没有价值,因为如果只使用gzip或类似工具压缩文本,将获得更好的性能。在压缩原始版本和缩小版本的大小后,Heck可能会彼此相差几个字节

如果您真的关心着色器作为资源的大小,只需压缩它(但请注意解压缩代码的开销)。编辑:但是,如果您的目标是WebGL,则使用HTTP传输gzip压缩。相关的浏览器确实支持这一切,并且大多数HTTP服务器可以配置为透明地提供一个补充的
.gz
后缀文件(或者动态地进行压缩和缓存)

对于优化,您应该参考Khronos的其他产品。特别是GLSL到SPIR-V编译器
glslc
、SPIR-V优化器
spirv opt
、SPIR-V反编译器
spirv cross
。您可以将这些链接起来,以创建优化的“精简”GLSL


由于SPIR-V工具是官方Vulkan SDK的一部分,而且SPIR-V也是OpenGL-4.6直接加载的有效着色器格式(而不仅仅是GLSL源代码),因此您可以很好地了解这一事实,这些工具都得到了很好的维护,将来也会如此。

可能会看到使用
--dump builder
选项的输出。不,该选项不是很有用,抱歉:(“某些库,如本库,使用此事实来创建着色器缩小库。”根据文档,该库以某种方式优化了着色器。可能是着色器文本恰好变短了,但这不是目标。正如该网站上所述,该库的动力是“相当多的移动平台在优化着色器方面非常糟糕……因此,以前脱机使用GLSL优化器可以使着色器运行得更快”。这与着色器的大小无关。那么你是在问大小更改还是性能优化?我是在问大小更改。@Makogan:我的观点是“大小更改”“这不是这些工具所能做的。这可能会发生,但这不是它们的重点。这就像买一辆汽车是因为它能产生二氧化碳;是的,有些工具会这样做,但这不是为什么你会得到这样一辆车。我很感激你的回答,但是,就像通常的情况一样,问题不是“我应该这样做吗?”问题是“我如何做到这一点“。换句话说,你可以给我一个很好的书面解释,说明如果我这样做,世界可能会怎样结束,我仍然会尝试这样做。我不能控制我的需求,所以我必须做我被要求做的事情。也就是说,减少GLSL存储空间。@Makogan:但我做了。我给了你确切的命令行,到1)将GLSL编译为SPIR-V,然后2)对SPIR-V进行优化,最后3)传输回GLSL。
glslc --target-env=opengl -fshader-stage=... -o ${FILE}.spv ${FILE}
spirv-opt -Os -o ${FILE}.spv.opt ${FILE}.spv
spirv-cross --output ${FILE}.opt ${FILE}.spv.opt