使用
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
设置OpenGL版本的时候,发现3.1版本就正常渲染,3.2以及以上就渲染不出来。
但是用RenderDoc抓帧能看到正确画面。
检查两个地方:
1.如果你的代码里有:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
改成兼容模式的PROFILE
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
2.检查在shader里是否有类似
#version 140
这样的版本指定。比如140就是指定了OpenGL3.1版本。改成你所需的版本
3.如果你是MacOS用户,请接着看下文。
看Lazy Foo的教程时,仿照他的代码,画一个带纹理坐标的quad练手。
在3.1版本,一切正常:
然后想着用RenderDoc抓帧确定一下数据对不对,结果RenderDoc只支持OpenGL3.2以上的context才能抓帧。
然后改成3.2,结果画不出来了,清背景色倒还正常:
然后我尝试renderDoc里抓一下帧,woc,renderDoc里抓帧数据是画出来的???
删除了shader中的#version还是不行后,终于在网上找到了原因:
https://stackoverflow.com/questions/30963927/cant-draw-with-opengl-version-greater-then-3-1-with-sdl
简而言之,OpenGL中的profile这一概念相当于一种标准,当我们使用core profile,就不允许使用“过时”的函数。
所以没有给我们画出来。改成兼容的PROFILE_COMPATIBILITY就好了。
对于MacOS,有些版本没办法,你只能改你自己的代码,换成最新函数/写法,直到符合core的标准。
PS:最终我选择了OpenGL3.3,因为看了网上介绍,3.3是shader mode4.0的最终版,符合目前主流引擎的东西。再往后
比如Compute shader对我这种用户就很少见了。
当初我选择学习ue4,就是为了不去接触这些坑,专心在实现上。没想到到了找工作的时候人家不在乎那些实现,只关注你
的工作经验(踩坑的经验)。仔细想想即使当初选择考研做“科研”,学习别人开放库时,碰到各种配置,编译的问题,一样躲不过。
怎么说呢,给我感觉就像成功路上堆满了狗屎,虽然和终点半毛钱关系没有,搞它纯粹浪费时间,但你不踩又没法成功。究其原因,算是“前辈的罪孽”,有时前辈也看不到今天,也没法说,只怪人不是神。
不过还是有一些收获的,顺便看到了OpenGL新版本的一些特性,很令人激动。(虽然根本不想花精力看openGL的API,更别说新的了)