在 Mac 上使用 openGL,不支持版本 '150' 错误

Posted

技术标签:

【中文标题】在 Mac 上使用 openGL,不支持版本 \'150\' 错误【英文标题】:Using openGL on mac, version '150' is not supported error在 Mac 上使用 openGL,不支持版本 '150' 错误 【发布时间】:2019-04-17 09:28:43 【问题描述】:

我正在尝试从学校设置我的作业,但唯一的指导是针对 Windows。我们将 Qt 用于着色器,我正在处理 Visual Studio 代码并使用终端进行编译。问题是似乎我尝试过的任何版本的 openGL 都会出现同样的错误:

*QOpenGLShader::compile(Vertex): ERROR: 0:1: '' :  version '150' is not supported* 

我使用的是 macbook mid 12,而且似乎我使用的是 openGL 4.1 版,我尝试了多个版本,例如 3.3、2.1 4.1 等。似乎没有什么办法。我也尝试过覆盖该版本,但这不起作用。我是否以错误的方式看待问题?

这是导致错误的源代码:

#version 150 core <----

// input from application
uniform vec3 vecLight;
uniform sampler2D samTexture;

// input from geometry shader
smooth in vec3 normal;
smooth in vec3 vertex;
smooth in vec3 cartescoord;

// material constants
float ka = 0.1;
float kd = 0.6;
float ks = 0.3;
float spec_exp = 50.0;

// useful constants
float PI = 3.14159265;

// output color
        out vec4 outFragColor;

        vec2 cartesian2normspherical(vec3 cart)

    float fPhi = 0.0;
    float fTheta = 0.0;

    float fRadius = length(cart);
    fTheta = acos (cart.z / fRadius) / (PI);
    fPhi = atan(cart.y, cart.x)/ (PI);

    //transform phi from [-1,1] to [0,1]
    fPhi = (fPhi+1.0)/2.0;

    return vec2(fPhi, fTheta);


float calcPhongBlinn(vec3 vecV, vec3 vecN, vec3 vecL)

    float fLightingIntesity = 1.0;

    float fDiffuseIntensity = clamp(dot(normal, vecLight), 0, 1);

    vec3 vecHalfway = normalize(vecL + vecV);
    float fSpecularIntensity = pow(clamp(dot(vecHalfway, vecN), 0, 1), spec_exp);

    fLightingIntesity = ka + kd*fDiffuseIntensity + ks*fSpecularIntensity;

    return fLightingIntesity;


void main(void)

    
    vec2 sphCoord = cartesian2normspherical(cartescoord);
    vec2 texcoord = sphCoord.xy;

    // this vector is constant since we assume that we look orthogonally at the computer screen
    vec3 vecView = vec3(0.0, 0.0, 1.0);
    float fI = calcPhongBlinn(vecView, normal, vecLight);
    
    vec4 vecColor =  texture2D(samTexture, texcoord.xy);

    outFragColor = vec4(vecColor.rgb*fI, 1.0);

这是广泛的错误:

QOpenGLShader::compile(Vertex): ERROR: 0:1: '' :  version '150' is not supported

*** Problematic Vertex shader source code ***

QOpenGLShader: could not create shader
QOpenGLShader::link: ERROR: One or more attached shaders not successfully compiled

在我的脚本文件运行时: 制作 && ./myMain.app/Contents/MacOS/myMain

EDIT1:将我的窗口文件添加到问题中

Window::Window()

    QGridLayout *mainLayout = new QGridLayout;


    QGLFormat glFormat;
    glFormat.setVersion(3, 3);
    glFormat.setProfile(QGLFormat::CoreProfile); 
    glFormat.setSampleBuffers(true);

    GLWidget *glWidget = new GLWidget(/*glFormat,0*/);
    mainLayout->addWidget(glWidget, 0, 0);
    
    setLayout(mainLayout);

    setWindowTitle(tr("Rendering with OpenGL"));

编辑2:

经过大量研究,我得出结论,首先我必须使用 openGL v: 3.3 才能使着色器工作。我的“OpenGl Extensions Viewer”说我的mac不支持,我仍然想知道是否有我可以利用的漏洞。因此,任何有关如何或是否可行的信息都会有所帮助。

最后编辑:

我找到了解决方案,您必须将 QGLFormat 作为构造函数参数传递给 QGLWidget。在这里找到了一些解决方案:

Qt5 OpenGL GLSL version error

感谢大家的帮助!

【问题讨论】:

GLSL 版本 150 对应于 OpenGL 3.2。您确定您正在创建 3.2 或更高版本的上下文吗? Possible duplicate. 我完全不确定,因为我对此很陌生,现在才开始了解它的实际工作原理。学校正在运行 330 作为作业的标准,它可以在 Windows 计算机上与 Qt 2017 一起使用,如果这能回答任何问题? 我对Qt了解不多,但是在创建窗口之前必须有一种方法可以选择所需的GL版本。 好的,那我应该为我的mac设置什么版本呢? 您可以尝试将版本设置为120;您的着色器中可能没有任何需要 150 的内容。 【参考方案1】:

从上面的问题复制:

经过大量研究,我得出的结论是,我首先 必须使用 openGL v: 3.3 才能使着色器工作。我的“OpenGl Extensions Viewer”说我的mac不支持,我还在想 如果有漏洞我可以利用。所以任何关于如何或 如果可以的话,会有所帮助。

所以最初的问题得到了回答,关于“漏洞”的第二部分应该作为一个单独的问题(与这个问题有关)提出。

更新

最后编辑:

我找到了解决方案,您必须将 QGLFormat 传递给 QGLWidget 作为 构造函数参数。在这里找到了一些解决方案:

Qt5 OpenGL GLSL 版本错误

感谢大家的帮助!

【讨论】:

我为什么要这样做? @ruubel 因为这不是问题标题所说的 嗯,这对于寻找相同问题的人来说是完美的。只需按照我的步骤并得出相同的结论即可。我错了吗? @ruubel 随你所愿......不知道你是否会得到任何其他答案

以上是关于在 Mac 上使用 openGL,不支持版本 '150' 错误的主要内容,如果未能解决你的问题,请参考以下文章

不能在 mac 小牛上使用 GLSL 330

如何在 MacOS 上使用 QGLFormat 更改 OpenGL 版本?

C++ OpenGL 着色版本错误 - 不支持 GLSL x [Ubuntu 16.04]

Unity3D 导出apk,OpenGL es2手机不支持问题的解决

显卡不支持OpenGL

使用驱动程序不支持的更高版本 OpenGL 的常量是不是安全?