OpenGL和GLSL版本更迭

前言

最近才发现,本身写的glsl和教程的glsl版本对不上,一直觉得是xcode不容许使用过高版本,只能使用OpenGL 2.0的版本,殊不知使用glfw可使用到最新的OpenGL版本。😂发现了解OpenGL 版本的迭代对于理解OpenGL是有帮助的。编程

OpenGL

2.0

从OpenGL 2.0开始,OpenGL 发生了重大的改变,其中最大的改变莫过于有了本身的着色语言,版本为1.00,毕竟以前使用的是固定管线,这也致使两个实现方式并存的局面。(注意从这个版本开始也再也不限制纹理大小必须是2的幂次数)xcode

3.0

在这个版本又进行了大改,弃用了以前版本的不少东西,增长了不少新东西。app

从OpenGL 3开始,编程模式被分为3种:code

  • 兼容模式:传统模式。
  • 核心模式:彻底新的纯可编程流水线模式,可是兼容废弃特性。(API再也不兼容旧的)
  • 核心向前兼容模式:彻底不兼容废弃特性,其它和核心模式相同。

3.2

这个版本,最大的变化就是支持了几何着色器,存在于顶点着色器和像素着色器之间,它的输入为:点、线和三角形,其输出点为点、线带和三角形带,虽然从根本上来讲都是顶点的处理,可是进入顶点着色器的是一次一个的顶点,而进入几何着色器的是一次一批的顶点。orm

3.3

这个版本就是如今教程里面使用的(好吧,我使用的版本差这么多),这个版本的shader model 4.0的OpenGL的最终版本,这个版本再也不须要查询输入变量(attribute)的location的方式,可使用layout去指定位置,还有片元着色器中的内建变量也弃用了,取而代之的是自定义的out变量。教程

4.0

这个版本增长细分曲面着色器,还有使用最新的Shader Language 4.00的subroutine提供了在运行时刻不须要切换着色器或者是从新编译或者使用if判断选择不一样功能的方法,下降了切换着色器程序所带来的巨大开销(切换着色器的CPU循环消耗真的很是的惊人)。ip

其中,细分曲面着色器一样在顶点着色器以后执行,可是细分曲面着色器和几何着色器谁先谁后呢?我在维基百科上找到了这个图。get

4.3

这个版本则是增长了能够用于并行计算的computer shader,避免在CPU中进行大量复杂的计算,能够减轻CPU的负担;同时在uniform也可使用layout进行指定了。it

比较

在网上找了相关的OpenGL和glsl的版本比较io

OpenGL Version GLSL Version
2.0 110
2.1 120
3.0 130
3.1 140
3.2 150
3.3 330
4.0 400
4.1 410
4.2 420
4.3 430

嗯,之后看shader就能够知道项目使用的版本了😏。

举个例子:

  • version 110

    Vertex shader:

    uniform mat4 projTrans;
    
    attribute vec2 Position;
    attribute vec2 TexCoord;
    
    varying vec2 vTexCoord;
    
    void main() {
        vTexCoord = TexCoord;
        gl_Position = u_projView * vec4(Position, 0.0, 1.0);
    }

    Fragment shader:

    uniform sampler2D tex0;
    
    varying vec2 vTexCoord;
    
    void main() {
        vec4 color = texture2D(tex0, vTexCoord);
        gl_FragColor = color;
    }
  • Version 330

    Vertex shader:

    #version 330
    
    uniform mat4 projTrans;
    
    layout(location = 0) in vec2 Position;
    layout(location = 1) in vec2 TexCoord;
    
    out vec2 vTexCoord;
    
    void main() {
        vTexCoord = TexCoord;
        gl_Position = u_projView * vec4(Position, 0, 1);
    }

    Fragment shader:

    #version 330
    uniform sampler2D tex0;
    
    in vec2 vTexCoord;
    
    //use your own output instead of gl_FragColor 
    out vec4 fragColor;
    
    void main() {
        //'texture' instead of 'texture2D'
        fragColor = texture(tex0, vTexCoord);
    }

    咱们能够发现,attribute和varying已经再也不使用了。取而代之的是in/out了(好吧,以前作的总结没用了,哈哈😅😅)。

使用

咱们知道mac osx是默认支持OpenGL 的,你们能够到官网上去查看本身的电脑支持的版本,我看了一下,最近的电脑都广泛已经支持到了4.1以上。

若是不想使用max os那套obj-c,可使用别的库,好比glfw。

使用glfw

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

这样就能够是使用到最新的GL版本了。

相关文章
相关标签/搜索