最近才發現,本身寫的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版本了。