错误 GLSL 版本不正确 450

Posted

技术标签:

【中文标题】错误 GLSL 版本不正确 450【英文标题】:Error GLSL incorrect version 450 【发布时间】:2017-09-06 10:48:40 【问题描述】:

我有一个过去编译的 OpenGL 应用程序,但现在不能在同一台机器上。问题似乎在于片段着色器没有正确编译。

我正在使用:

Glew 2.1.0 Glfw 3.2.1

所有必要的上下文都在程序开始时创建。这是我的程序创建函数的样子:

std::string vSource, fSource;
try 

    vSource = getSource(vertexShader, "vert");
    fSource = getSource(fragmentShader, "frag");

catch (std::runtime_error& e)

    std::cout << e.what() << std::endl;


GLuint vsID, fsID;
try

    vsID = compileShader(vSource.c_str(), GL_VERTEX_SHADER); //Source char* was checked and looking good
    fsID = compileShader(fSource.c_str(), GL_FRAGMENT_SHADER);

catch (std::runtime_error& e)

    std::cout << e.what() << std::endl; //incorrect glsl version 450 thrown here

GLuint programID;
try

    programID = createProgram(vsID, fsID); //Debugging fails here

catch (std::runtime_error& e)

    std::cout << e.what() << std::endl;


glDeleteShader(vsID);
glDeleteShader(fsID);

return programID;

我的主要:

/* ---------------------------- */
/* OPENGL CONTEXT SET WITH GLEW */
/* ---------------------------- */
static bool contextFlag = initializer::createContext(vmath::uvec2(1280, 720), "mWs", window);
std::thread* checkerThread = new std::thread(initializer::checkContext, contextFlag);

/* --------------------------------- */
/* STATIC STATE SINGLETON DEFINITION */
/* --------------------------------- */
Playing Playing::playingState; //Failing comes from here which tries to create a program



/* ---- */
/* MAIN */
/* ---- */
int main(int argc, char** argv)

    checkerThread->join();
    delete checkerThread;

    Application* app = new Application();
    ...
    return 0;

下面是 fragmentShader 文件的示例:

#version 450 core

out vec4 fColor;

void main()

    fColor = vec4(0.5, 0.4, 0.8, 1.0);

这就是我发现的错误:

[Engine] Glew initialized! Using version: 2.1.0
[CheckerThread] Glew state flagged as correct! Proceeding to mainthread!

Error compiling shader: ERROR: 0:1: '' :  incorrect GLSL version: 450
ERROR: 0:7: 'fColor' : undeclared identifier
ERROR: 0:7: 'assign' :  cannot convert from 'const 4-component vector of float' to 'float'

我的规格如下:

英特尔高清 4000 英伟达 GeForce 840M

我将声明我之前在同一台机器上编译过着色器。磁盘格式化后我不能再这样做了。但是,每个驱动程序都会更新。

【问题讨论】:

您确定您的图形驱动程序是最新的吗?它们都支持 GLSL 版本 450 我找不到 Intel 卡的信息,但 Nvidia 肯定应该支持 GLSL 450。你试过用你的 Nvidia 卡运行你的程序吗? (通常 Windows 默认为 Intel 的,所以检查一下) 它可能仍在使用英特尔的显卡。转到桌面,右键单击,选择 NVIDIA 控制面板,管理 3D 设置。现在从首选的图形处理器中选择 NVIDIA 并重试。无论如何,就像我说的那样,您的英特尔显卡支持该着色器模型 @Asesh run with graphics processor 选项无法正常工作。你是对的。选择 NVIDIA 作为全球首选是可行的。正如有关英特尔 HD 4000 支持 OpenGL 4.5 的说法可能已经过时了,因为我没有过多关注它们。 HD 4000 (Ivy Bridge) 在 windows 上支持 4.0,在 linux 上支持 4.2。不支持 4.5。 【参考方案1】:

正如 cmets 中所述,问题似乎在于使用选定的 graphics card 运行 IDE 的错误选项。由于 windows 默认集成 Intel HD 4000 卡,因此将 NVIDIA 卡切换为操作系统默认的首选卡即可解决此问题。

【讨论】:

以上是关于错误 GLSL 版本不正确 450的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X 上的 GLSL 版本 130 导致错误 [关闭]

错误:不支持 GLSL 3.30。支持的版本有:1.10、1.20、1.30、1.00 ES、3.00 ES、3.10 ES 和 3.20 ES [关闭]

错误:不支持GLSL 3.30。支持的版本包括:1.10,1.20,1.30,1.00 ES,3.00 ES,3.10 ES和3.20 ES [关闭]

超过一个字符指针时的GLSL编译错误(glShaderSource)

不支持 GLSL 330 内核

GLSL程序错误执行