OpenGL 3. + glsl兼容性混乱?

时间:2013-11-23 10:12:35

标签: opengl glsl

所以,我搜索了很多opengl 3. +教程,都包含着色器(GLSL 330核心)。然而,我没有支持这些较新的GLSL实现的显卡,要么我必须更新我的驱动程序,但我仍然不确定我的卡是否本质上能够支持它。

目前我的openGL版本是3.1,我在带有C ++的Windows上创建了一个具有向后兼容性的现代上下文。通过NVIDIA Cg编译器(完整定义)和GLSL 1.30 - >我的GLSL版本是1.30。版本130。

问题是:版本130完全基于传统的opengl管道,因为它包含viewmatrix,modelmatrix等等。然后当我在我的客户端应用程序中使用核心功能时,我应该如何使用它们(OpenGL 3) +)?

这真令人困惑,给我具体的例子。

此外,我希望我的应用程序能够在大多数OpenGL实现上运行,那么你能告诉我传统GLSL和现代GLSL之间的边界在哪里吗? GLSL 300是现代GLSL,与旧版GLSL版本的OpenGL 3. +有兼容性吗?

1 个答案:

答案 0 :(得分:9)

我会说OpenGL 3.1是现代的OpenGL。

任何支持OpenGL 3.1的硬件都能够支持OpenGL 3.3。驾驶员是否始终支持它是另一回事。更新显卡可能会让您遇到OpenGL 3.3。

要清除这一点,OpenGL 3.1不是传统的OpenGL。

传统的OpenGL将是:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(90.0, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0, -5.0);

哪个OpenGL 3.1具有兼容性上下文支持,但这并不意味着它应该被使用。如果您正在为支持OpenGL 3的硬件开发,那么您绝对不应该使用它。您可以通过请求核心上下文来禁用旧版功能。

如果您使用着色器,那么您已经移走了旧的固定功能管道。所以GLSL 130不是遗产:P。

使用我的英特尔CPU在我的Linux笔记本电脑上工作,其中最新的稳定驱动程序仅适用于OpenGL 3.1(是的OpenGL 3.3提交到位,但我正在等待MESA 10;))我没有太多的努力能够让OpenGL 3.3教程在我的机器上运行而不涉及传统的OpenGL。

OpenGL的一个奇妙之处在于您可以使用OpenGL扩展来扩展功能。即使您的硬件无法处理OpenGL 4.4,您仍然可以使用不需要OpenGL 4 HW和更新驱动程序的扩展!

有关哪些功能添加到旧硬件的信息,请参阅https://developer.nvidia.com/opengl-driverhttp://developer.amd.com/resources/documentation-articles/opengl-zone/,但如果您不确定,则需要在硬件上进行测试。

我完成后说遗产OpenGL也有它的位置。

在我看来,传统OpenGL可能比现代OpenGL更容易学习,因为您不需要着色器和OpenGL缓冲区的知识来绘制您的第一个三角形,但我不认为您应该在现代生产中使用它应用

如果您需要旧硬件支持,则可能需要使用较旧的OpenGL版本。即使是现代CPU也支持OpenGL 3,所以我不会太担心这一点。

从OpenGL 3.3转换为OpenGL 3.0

我在http://www.opengl-tutorial.org/的教程中对其进行了测试。我不能把我转换的代码放大,因为大部分内容都来自教程,我没有权限将代码放在这里。

他们的作者谈到了OpenGL 3.1,但由于他受到glsl 130(OpenGL 3.0)的限制,我正在转换为3.0。

  1. 首先将上下文版本更改为OpenGL 3.0(只需更改即可 如果你在教程中工作,则将次要版本设置为0)。如果您使用OpenGL 3.0,也不要将其设置为使用核心上下文,因为据我所知,ARB_compatibility只能从OpenGL 3.1获得。

  2. 将着色器版本更改为

    #version 130
    
  3. 删除着色器中的所有布局绑定

     layout(location = #) in vec2 #myVarName;
    

     in vec2 #myVarName;
    
  4. 使用glBindAttribLocation绑定指定的布局(参见3)

    e.g

    glBindAttribLocation(#myProgramName, #, "#myVarName");
    
  5. 使用glBindFragDataLocation按指定的方式绑定输出布局(参见3)

    e.g

    glBindFragDataLocation(#myProgramName, #, "#myVarName");
    
  6. glFramebufferTexture在OpenGL 3.0中不起作用。 (用于阴影贴图和延迟渲染等)。相反,您需要使用glFramebufferTexture2D。 (它有一个额外的参数,但文档就足够了)

  7. 这是tutorial16的截图(我虽然这个涵盖了大部分区域并使用了这个测试,看看是否需要所有这些)

    tutorial16 with OpenGL 3.0

    tutorial16的来源存在错误(撰写本文时)。 FBO设置为没有颜色输出,但片段着色器仍然输出颜色值,导致段错误(尝试写任何东西)。只需将深度片段着色器更改为输出即可修复它。 (不会对更宽容的司机产生段错误,但这不是你应该讨价还价的事情)