解决:SDL2+OpengGL在OpengGL3.2版本以上渲染不显示问题

长话短说:

使用

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用户,请接着看下文。

背景-What Really happened

看Lazy Foo的教程时,仿照他的代码,画一个带纹理坐标的quad练手。

在3.1版本,一切正常:

解决:SDL2+OpengGL在OpengGL3.2版本以上渲染不显示问题_第1张图片

然后想着用RenderDoc抓帧确定一下数据对不对,结果RenderDoc只支持OpenGL3.2以上的context才能抓帧。

然后改成3.2,结果画不出来了,清背景色倒还正常:

解决:SDL2+OpengGL在OpengGL3.2版本以上渲染不显示问题_第2张图片

然后我尝试renderDoc里抓一下帧,woc,renderDoc里抓帧数据是画出来的???

删除了shader中的#version还是不行后,终于在网上找到了原因:

https://stackoverflow.com/questions/30963927/cant-draw-with-opengl-version-greater-then-3-1-with-sdl

解决:SDL2+OpengGL在OpengGL3.2版本以上渲染不显示问题_第3张图片

简而言之,OpenGL中的profile这一概念相当于一种标准,当我们使用core  profile,就不允许使用“过时”的函数。

所以没有给我们画出来。改成兼容的PROFILE_COMPATIBILITY就好了。

对于MacOS,有些版本没办法,你只能改你自己的代码,换成最新函数/写法,直到符合core的标准。

PS:最终我选择了OpenGL3.3,因为看了网上介绍,3.3是shader mode4.0的最终版,符合目前主流引擎的东西。再往后

比如Compute shader对我这种用户就很少见了。

总结

当初我选择学习ue4,就是为了不去接触这些坑,专心在实现上。没想到到了找工作的时候人家不在乎那些实现,只关注你

的工作经验(踩坑的经验)。仔细想想即使当初选择考研做“科研”,学习别人开放库时,碰到各种配置,编译的问题,一样躲不过。

怎么说呢,给我感觉就像成功路上堆满了狗屎,虽然和终点半毛钱关系没有,搞它纯粹浪费时间,但你不踩又没法成功。究其原因,算是“前辈的罪孽”,有时前辈也看不到今天,也没法说,只怪人不是神。

不过还是有一些收获的,顺便看到了OpenGL新版本的一些特性,很令人激动。(虽然根本不想花精力看openGL的API,更别说新的了)

 

 

你可能感兴趣的:(图形API)