我有一个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的跨平台访问。这似乎不是真的。
这个问题有解决方法吗?我花了几个小时搜索,一无所获。
答案 0 :(得分:0)
这是我的修复。它有效,但我仍然对更好的修复和解释到底发生了什么感兴趣。
问题的原因似乎有两个:着色器编译器不支持GLSL着色器语言的OpenGL ES版本,而OpenGL ES实现不支持所有混合模式,特别是{{1} }。
这是你做的:
从着色器程序中删除所有glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
限定符或语句。这可以通过添加precision
语句以标准方式完成,以便在着色器程序开始时将#define
,lowp
和mediump
定义为空,并且仅执行此操作在受影响的平台上(Mac上的Qt)。
使用混合函数highp
。
对所有透明色使用预乘alpha。
在片段着色器中调整颜色时,将颜色的所有分量乘以Alpha值glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
而不是gl_FragColor *= vec4(alpha);
。你需要这样做,这样你就不会得到大于alpha值的R,G或B分量,这在使用预乘alpha时是非法的,并且可能是未绘制透明色的原因。