OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V

时间:2021-12-04 23:35:12

学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader),

主要是不用现场编译,加快读取速度。

好吧,这些其实都是借口,就是TM不想让你看到我写的代码,这才是最主要的原因...

关于SPIR-V,这里有个文章说明。

http://gad.qq.com/program/translateview/7172708

网上的OpenGL教程似乎都没有介绍如何使用OpenGL Compute Shader的,书看的少,似乎OpenGL Programming Guide第8还是第9版有,但是因为那哥们的代码我编译不了,所以无缘一窥。

昨晚在Gayhub下了第9版源码,终于用CMake做为工程发布了,可喜可贺,于是下载下来运行一下,发现不是我想要的效果,虽然没看过这本书,但是这么多年了,这例子还不如网上的OpenGL教程例子靠谱,不得不说...还是不说了,大家都懂...

Shift + Delete

继续搜Gayhub,发现一个Windows下能跑的CS例子,还有youtube演示,应用总算入门级了。

https://github.com/multiprecision/sph_opengl

下载下来,发现是VS2017的工程,强行改成2015,发现用的库又是用2017预编译的,找到2015预编译换上,发现要求OpenGL版本4.6,而我的才4.5,更新老黄家驱动,4.6了,但是发现文件名又不对。

他的文件名为什么用的都是../shader/particle.vert.spv,都是spv扩展,而我下载只有vert没有后面的spv,一个都没有,于是傻呼呼的都把.spv去掉了,还是不行,又把文件名还原了回去。

正懵逼中,发现shader目录下还有一个compile.py文件,打开一看,马个鸡,果然还是得编译才行啊,这不是和DX的那个fxc套路一样么。

正好昨晚想折腾SPIR-V,已经下了glslang

https://github.com/KhronosGroup/glslang

直接Realse页面下,下载glslang-master-windows-x64-Release.zip就行。其实只需要glslangValidator.exe这一个文件而已。

丢到shader目录下,运行python compile.py,如果没装py自己照猫画狗处理下就行了。

发现效率出奇的差,和DX SDK的SPH例子比差太远,不知道是不是跑在集显的原因,虽然显卡设置我已经换成所有程序全都用核显运行了,但是不排除OpenGL选项不智能,以前用OpenCL就有这种情况,核显集显要自己切,不像CUDA会默认用核显。

不管怎么说,没找到原因就先降数量吧,原粒子数2万,去个0就好了

#define SPH_NUM_PARTICLES 2000

再处理下坑爹的窗口大小,笔记本看1000x1000真TM痛苦,白皮似乎很多人喜欢写成1000x1000,不知道是从哪流行起来的。

window = glfwCreateWindow(800, 600, "", nullptr, nullptr);

解决

二进制读取Shader?源码里搜glShaderBinary