最近才发现,本身写的glsl和教程的glsl版本对不上,一直觉得是xcode不容许使用过高版本,只能使用OpenGL 2.0的版本,殊不知使用glfw可使用到最新的OpenGL版本。😂发现了解OpenGL 版本的迭代对于理解OpenGL是有帮助的。编程
从OpenGL 2.0开始,OpenGL 发生了重大的改变,其中最大的改变莫过于有了本身的着色语言,版本为1.00,毕竟以前使用的是固定管线,这也致使两个实现方式并存的局面。(注意从这个版本开始也再也不限制纹理大小必须是2的幂次数)xcode
在这个版本又进行了大改,弃用了以前版本的不少东西,增长了不少新东西。app
从OpenGL 3开始,编程模式被分为3种:code
这个版本,最大的变化就是支持了几何着色器,存在于顶点着色器和像素着色器之间,它的输入为:点、线和三角形,其输出点为点、线带和三角形带,虽然从根本上来讲都是顶点的处理,可是进入顶点着色器的是一次一个的顶点,而进入几何着色器的是一次一批的顶点。orm
这个版本就是如今教程里面使用的(好吧,我使用的版本差这么多),这个版本的shader model 4.0的OpenGL的最终版本,这个版本再也不须要查询输入变量(attribute)的location的方式,可使用layout去指定位置,还有片元着色器中的内建变量也弃用了,取而代之的是自定义的out变量。教程
这个版本增长细分曲面着色器,还有使用最新的Shader Language 4.00的subroutine提供了在运行时刻不须要切换着色器或者是从新编译或者使用if判断选择不一样功能的方法,下降了切换着色器程序所带来的巨大开销(切换着色器的CPU循环消耗真的很是的惊人)。ip
其中,细分曲面着色器一样在顶点着色器以后执行,可是细分曲面着色器和几何着色器谁先谁后呢?我在维基百科上找到了这个图。get
这个版本则是增长了能够用于并行计算的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版本了。