OpenGL踩坑总结1----入门篇
- 该系列第一篇文章,做简短的介绍吧:我大概是19年11月开始开的这个坑,参考LearnOpenGL系列教程去学习的,不得不说这是一部良心教程,不少视频教程教OpenGL的几乎都是参照LearnOpenGL做的,视频好懂但内容都不全面,很多只教LearnOpenGL入门篇就没有下文了,还是啃文章才能学到真东西啊。然而文章是死的,人是活的。鉴于OpenGL的库代码过于底层,很多东西不封装就要写很多重复代码,很费劲,所以我的代码仓库里面有针对一些重复模块的封装,而且还把开发环境集成在仓库里,这样,不论任何一台windows电脑,只要有vs2017,不需要配置任何东西就能跑通仓库里现有的代码。言归正传,以下是坑:
1. 配置环境的小技巧
- 对于刚入门的人来说,最痛苦的莫过于搭建环境,这里推荐一个vs2017好用的东西,叫"项目属性表(.prop)"文件,在"属性管理器"点击右键任意文件夹可以创建属性表,在项目文件夹里面可以找到它,然后设置属性表的各种库文件和头文件目录(如何设置自行百度),保存,然后将这个自定义的属性表单独拿出放在自己觉得特殊的目录里。
- 这样做的好处是,当创建新的项目时,看项目运行平台是什么,如果是debug|x86平台,就在"Debug|Win32"文件夹右键添加这张自定义的属性表,其他平台同理。这样做不仅省去每次创建项目就配置环境的麻烦,更重要的是,你在其他机器运行你现有的的代码时,只要这张属性表还在,那就不用再配置环境了。
2. OpenGL函数库头文件顺序
- OpenGL函数库的头文件顺序是需要注意的,图片是正确头文件顺序
如果顺序反了会运行会报错......原因不明,希望知道的大佬可以指点迷津
3. 不要随意使用glDeleteXXX函数
- 一些(unsigned int)类型的所谓"顶点数组对象(VAO)"、"顶点缓冲对象(VBO)"、"纹理对象"等等,可以理解为id号,或者指针,当调用glDeleteXXX函数的时候就相当于抹去了它所指向的内存空间,所以必须确认这些对象不被使用的时候,才调用glDeleteXXX函数去回收。不然就会出现模型消失或贴图变黑的情况。
4. 纹理的坑
- 单个纹理的情况下,它的采样器(sampler=0)与纹理单元(GL_TEXTURE0)是有默认值的,不用手动设置,在多纹理的情况下则需要激活纹理单元(glActiveTexure),并设置采样器(shader.setInt("sampler",value))。
- 纹理采样器为空的情况下,glsl的纹理采样函数(texture)会采样失败,而且这种失败是无法检测到,只能通过在外部传入一个bool值到着色器,以此来判断采样器是否为空。