OpenGL 3. + glsl兼容性混乱?

use*_*347 5 opengl glsl

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

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

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

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

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

Xon*_*nar 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);
Run Code Online (Sandbox Code Playgroud)

哪个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/,但如果您是不确定所有你需要做的就是在你的硬件上测试它.

我完成后说Legacy 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除着色器中的所有布局绑定

     layout(location = #) in vec2 #myVarName;
    
    Run Code Online (Sandbox Code Playgroud)

     in vec2 #myVarName;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用glBindAttribLocation来绑定指定的布局(参见3)

    例如

    glBindAttribLocation(#myProgramName, #, "#myVarName");
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用glBindFragDataLocation绑定out布局(参见3)

    例如

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

这是tutorial16的截图(我虽然这个涵盖了大多数领域并使用了这个测试,看看是否需要所有这些)

使用OpenGL 3.0的tutorial16

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