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

Posted

技术标签:

【中文标题】OpenGL ES 2.0 适用于 Windows 和 Linux,但不适用于 Mac【英文标题】:OpenGL ES 2.0 works on Windows and Linux but not on Mac 【发布时间】:2017-11-23 09:31:52 【问题描述】:

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

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

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

我发现我可以通过从着色器中删除“精度”语句在显示器上显示一些图形。但是,显示不正确 - 缺少一些图形。我发现只绘制了不透明 (alpha = 1) 的像素。

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

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

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

【问题讨论】:

你在使用QSurfaceFormat::setProfile()吗? (Apple 不使用 win/linux 等配置文件)。如果您不使用Qt 5.1 可能不会,尽管QOpenGLContext::versionFunctions() 在这种情况下应该可以帮助您。如果您使用的是Qt 5.1,那么QAbstractOpenGLFunctions 最终可能会有所帮助。 qt.apidoc.info/5.1.1/qtgui/… 我试过了。它没有帮助。明确询问 OpenGL ES 2.0 上下文会导致黑屏和“创建上下文失败”错误。目前,通过摆脱着色器中的“精度”,我得到了除像素透明度之外的一切工作,如上所述。 此时我唯一的其他建议是看看这个问题(作者发布了他的问题的解决方案)。 ***.com/q/23779357/499581 【参考方案1】:

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

问题的原因似乎有两个:着色器编译器不支持 GLSL 着色器语言的 OpenGL ES 版本,并且 OpenGL ES 实现不支持所有混合模式,尤其是glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

这就是你要做的:

    从着色器程序中删除所有 precision 限定符或语句。这可以通过在着色器程序开始时添加#define 语句以将lowpmediumphighp 定义为空,并且仅在受影响的平台上(Qt on the Mac)。

    使用混合功能glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);

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

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

【讨论】:

以上是关于OpenGL ES 2.0 适用于 Windows 和 Linux,但不适用于 Mac的主要内容,如果未能解决你的问题,请参考以下文章

Android设备上的OpenGL ES 2.0扩展[关闭]

OpenGL ES 2.0——简单粒子系统的最佳路径

如何在 OpenGL ES 2.0 中使用 png 图像纹理立方体?

OpenGL ES 2.0 雾

OPENGL ES 2.0 知识串讲 ——OPENGL ES 详解III(纹理)

iOS OpenGL ES 和 Android OpenGL ES 的区别