Javascript與WebGL之間的一個最大區別在於,WebGL的操做通常不會拋出錯誤web
若是但願獲取WebGL的錯誤信息,那麼就須要手動調用 gl.getError() 方法瀏覽器
該方法會返回如下錯誤常量之一:webgl
須要注意的 getError() 方法一次只會返回一個錯誤值,若是產生了多個錯誤最好循環調用該方法,直到該方法的返回值是一個 gl.NO_ERROR 爲止spa
着色器(shader) 是 OpenGL 中的另外一個概念, WebGL中有兩種着色器指針
WebGL着色器的難點在於着色器並非使用JAVAScript編寫的,這些着色器是使用 GLSL (一種類C語言編寫的)調試
在開始代碼前簡單介紹一下着色器編寫的相關事宜code
因爲瀏覽器不能解析 GLSL 程序,因此咱們須要準備好字符串形式的 GLSL 程序,以便編譯連接到着色器程序orm
如:對象
<script type="x-webgl/x-vertex-shader" id="vertexShader"> attribute vec2 aVertexPosition; void main(){ gl_Position = vec4(aVertexPosition, 0.0, 1.0); } </script> <script type="x-webgl/x-vertex-shader" id="fragmentShader"> uniform vec4 uColor; void main(){ gl_FragColor = uColor; } </script>
而後咱們須要經過上面的片斷來建立着色器對象:blog
let vertexGlsl = document.getElementById("vertexShader").text, fragmentGlsl = document.getElementById("fragmentShader").text; // 建立着色器 let vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexGlsl); // 編譯着色器 gl.compileShader(vertexShader); let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentGlsl); gl.compileShader(fragmentShader); let program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program);
上方建立完成的着色器必須接收一個值才能工做
傳入變量須要兩個步驟,首先須要獲取變量的位置,而後給該變量賦值
let uColor = gl.getUniformLocation(program, "uColor"); gl.uniform4fv(uColor, [0, 0, 0, 1]); let aVertexPosition = gl.getAttribLocation(program,"aVertexPosition"); gl.enableVertexAttribArray(aVertexPosition);// 啓用Attribute變量 gl.vertexAttribPointer(aVertexPosition, itemSize, gl.FLOAT, false ,0,0);// 建立指針,指向gl.bindBuffer指定的緩衝區並保存在 aVertexPosition中供頂點着色器使用
與WebGL的其餘操做同樣 着色器操做也可能會失敗,而且也是靜默失敗
若是但願獲取着色器的錯誤信息,那麼則須要調用 gl.getShaderParameter(),來獲取着色器的編譯狀態
if(!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)){ alert(get.getShaderInfoLog(vertexShader)); }
若是要檢測連接效果可使用以下代碼
if(!gl.getProgramParameter(program, gl.LINK_STATUS)){ alert(get.getProgramInfoLog(program)); }