关于我这踩过的关于OpenGL的坑
这两天我几乎一门心思扑在了OpenGL上面了,也踩了不少坑,在这里我向大家分享一下关于我所踩过的坑。
1.OpenGL关于版本
以下是我的吐槽,可以跳过。
OpenGL最新版本是2017年出的4.6,从NVIDIA当年发布的驱动说明来看,这貌似是OpenGL的最终版本。妈耶,这东西原来都差不多凉了吗。其实以目前来看OpenGL还是挺不错的,特别是4.6版本开始完全支持SPIR-V。这是个什么东西呢?玩过现代OpenGL的想必都写过着色器,但如果你想要使用着色器,在此之前你要么在源代码里写个const char*类型的字符串,要么自己写一个着色器的加载类,这他妈烦不烦啊。而且我等既然都用起了C++,这种运行时的编译过程自然是怎么看怎么不顺眼。所以,这个时候,SPIR-V登场了,SPIR-V实际上就是着色器程序的中间代码,可以直接加载到程序中使用,但是这有个问题出现了。
使用二进制的中间代码文件要求使用两个API函数,一个是glShaderBinary,一个是glSpecializelizeShader。这两个函数一个是OpenGL4.1的函数,一个是OpenGL4.6的函数,我也不知道为什么要这么设计,反正如果你OpenGL如果不是4.6,你就不得不自己写个着色器代码的加载类了,或者字符串内嵌到代码里面。本人的GTX 1050自然是支持OpenGL4.6的所以我就开开心心的上手了。
但是GLFW在我设置了4.6版本后居然罢工了。
我甚至一度怀疑GLFW这个2016年最后一个版本的第三方窗体库是不是不支持4.6,最后自然是我错了,人家当然支持。
是我一直在开着核显跑程序。
intel7代酷睿的核显不支持4.6。
解决方法自然是更改了显卡的全局设置,问题解决。
2.关于GLAD的问题
一开始我的GLAD是从github上不知道哪里下的,第三方库本身就不支持4.6版本。
这里我给出一下我最后弄GLAD的地址。
3.关于glslang工具编译报错
我一开始编译着色器的时候会报如下错误:
'location' : SPIR-V requires location for user input/output
其实SPIR-V对源代码的要求更加严格,你必须要对每个着色器程序的in和out变量都要加上一个layout(location=xxx),不然就会报错。