C++ OpenGL GLSL着色器版本

C++ OpenGL GLSL着色器版本,c++,opengl,version,shader,compatibility,C++,Opengl,Version,Shader,Compatibility,最近,我在不同计算机上使用GLSL着色器版本时遇到了一些问题。我知道每个GPU都可以对着色器提供不同的支持,但我不知道如何制作一个适用于所有GPU的着色器。如果我在我的PC(GPU-AMD HD7770)上写一些着色器,我甚至不必指定版本,但在一些旧PC上或使用nVidia GPU的PS上,版本更严格,因此我必须指定GPU支持的版本 现在真正的问题来了。如果我在我的电脑上指定了330版,它会正常工作,但在其他应该支持330版的电脑上,它似乎不工作。所以我必须重写它,让它工作。如果我切换回我的电脑

最近,我在不同计算机上使用GLSL着色器版本时遇到了一些问题。我知道每个GPU都可以对着色器提供不同的支持,但我不知道如何制作一个适用于所有GPU的着色器。如果我在我的PC(GPU-AMD HD7770)上写一些着色器,我甚至不必指定版本,但在一些旧PC上或使用nVidia GPU的PS上,版本更严格,因此我必须指定GPU支持的版本

现在真正的问题来了。如果我在我的电脑上指定了330版,它会正常工作,但在其他应该支持330版的电脑上,它似乎不工作。所以我必须重写它,让它工作。如果我切换回我的电脑,它有更新的GPU,它也不工作


有人知道吗,我必须如何编写着色器才能在所有GPU上运行?

编写可移植的OpenGL代码并不像您希望的那样简单

  • nVidia驱动程序是允许的。你可以在nVidia驱动程序上做很多其他系统无法做到的事情

  • 很容易意外地使用额外的功能。例如,我编写了一个针对3.2核心配置文件的程序,但使用了
    GL_INT_2_10_10_REV
    作为顶点格式。
    GL_INT_2_10_10_10_REV
    符号在3.2中定义,但在3.3之前,它不允许作为顶点格式,并且您不会因为意外使用它而收到任何错误消息

  • 很多人使用旧的驱动程序。根据Steam调查,2013年,38%使用OpenGL 3.x驱动程序的客户没有3.3支持,尽管支持3.0的硬件应该支持3.3

  • 你总是需要测试。这是一个不幸的现实

  • 我的建议是:

    • 始终以核心配置文件为目标

    • 始终指定着色器语言版本

    • 检查驱动程序版本,如果太旧则中止

    • 如果可以,请使用OpenGL标题/绑定,这些标题/绑定仅公开目标版本中的符号

    • 获取目标版本的规范副本,并将其用作参考,而不是OpenGL手册页

    • 如果可行的话,编写代码以便它也可以在OpenGL ES上运行

    • 在不同的系统上进行测试。一台电脑可能无法切断它。如果你能从另一家供应商那里找到另一台配有显卡的PC(别忘了英特尔的集成显卡),那就更好了。你可以花几百美元买一个OpenGL 3.x桌面,或者如果你想省钱,可以要求使用朋友的电脑进行一些快速测试。你也可以买第二张视频卡(一张支持OpenGL4.x的低端卡的价格不到40美元),但换掉时要小心


    商业游戏在各种系统上运行的主要原因是它们有QA预算。如果你能负担得起一个QA团队,那就去做吧!如果你没有QA团队,那么你将不得不同时进行QA和开发工作——两项工作要做得更多,但这是你为消除bug所付出的代价。

    一个在所有GPU和可能所有驱动程序版本上运行的着色器。。。祝你好运!游戏是如何做到这一点的?我知道这在某种程度上是可能的,那么为什么你认为不是呢?你使用的是什么OpenGL版本?我的OpenGL版本是4.3.12618FYI,你没有指定GPU支持的版本。在着色器顶部包含一个
    #version…
    指令,因为解析规则因版本而异。例如,GLSL 1.10不支持浮点常量的
    f
    后缀。如果您编写
    #version 110
    (或者根本不包含
    #version
    ),则类似
    1.0f
    的内容应该会在兼容的GLSL编译器中生成解析错误。要消除该解析错误,您必须升级到
    #version 120
    。这正是我想要的答案,非常感谢!我不认为这很容易,但我认为如果我能实现openGL版本>3.0:)@ProXicT:我不会为openGL 3.0烦恼,因为openGL 3.2核心上下文不需要支持任何早于1.40的GLSL版本,我会很高兴。例如,如果您的目标是3.0(和GLSL 1.30),那么您就不能在OSX上运行!我认为最好是以3.2内核为目标,或者完全回到2.1,忘记VAOs。所以我必须指定的所有内容都是
    #version 330
    ,并针对该版本进行优化?是的,我会在任何地方使用
    #version 330 core
    #version 150 core
    。第1点和第2点:您可以尝试运行着色器,这应该更严格,并检查常见错误。