OpenGL ES 2.0适用于Windows和Linux,但不适用于Mac

时间:2017-11-23 09:31:53

标签: macos qt opengl-es opengl-es-2.0

我有一个Qt应用程序,它的主窗口使用QOpenGLWidget。它使用OpenGL ES 2.0绘制,使用QOpenGLFunctions来解析OpenGL函数。在Windows和Linux上,一切都运行良好(使用相同的Qt应用程序)。我在所有三个平台上使用Qt 5和Qt Creator。

但是,在Mac上,绘制图形不起作用。当我第一次尝试运行该应用程序时,它崩溃了,因为它无法编译着色器程序,抱怨“精确度”#39;关键字在语法上是不正确的。这可能表明着色器编译器需要不同版本的着色器语言。

我尝试插入' #version 100'在着色器程序开始时,但没有帮助:这次的错误消息是不支持版本100。

我发现我可以通过删除'精度来获得显示器上的图形。着色器的声明。但是,显示不正确 - 缺少一些图形。我发现只绘制了没有透明度的像素(alpha = 1)。

我对使用OpenGL ES 2.0的正确性充满信心,因为除了在Windows和Linux上的Qt下工作外,相同的代码在Android(本机代码)和iOS上的Qt之外也能完美运行。

根据Qt文档,QOpenGLFunctions'提供对OpenGL ES 2.0 API的跨平台访问。这似乎不是真的。

这个问题有解决方法吗?我花了几个小时搜索,一无所获。

1 个答案:

答案 0 :(得分:0)

这是我的修复。它有效,但我仍然对更好的修复和解释到底发生了什么感兴趣。

问题的原因似乎有两个:着色器编译器不支持GLSL着色器语言的OpenGL ES版本,而OpenGL ES实现不支持所有混合模式,特别是{{1} }。

这是你做的:

  1. 从着色器程序中删除所有glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)限定符或语句。这可以通过添加precision语句以标准方式完成,以便在着色器程序开始时将#definelowpmediump定义为空,并且仅执行此操作在受影响的平台上(Mac上的Qt)。

  2. 使用混合函数highp

  3. 对所有透明色使用预乘alpha。

  4. 在片段着色器中调整颜色时,将颜色的所有分量乘以Alpha值glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);而不是gl_FragColor *= vec4(alpha);。你需要这样做,这样你就不会得到大于alpha值的R,G或B分量,这在使用预乘alpha时是非法的,并且可能是未绘制透明色的原因。