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
语句以将lowp
、mediump
和highp
定义为空,并且仅在受影响的平台上(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 中使用 png 图像纹理立方体?