1/* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15export function checkError(gl, err) { 16 let error; 17 if (err) { 18 error = err; 19 } 20 else { 21 error = gl.getError(); 22 } 23 switch (error) { 24 case gl.NO_ERROR: 25 console.info("webgltest checkError:NO_ERROR code:", error); 26 break; 27 case gl.INVALID_ENUM: 28 console.info("webgltest checkError:INVALID_ENUM code:", error); 29 break; 30 case gl.INVALID_VALUE: 31 console.info("webgltest checkError:INVALID_VALUE code:", error); 32 break; 33 case gl.INVALID_OPERATION: 34 console.info("webgltest checkError:INVALID_OPERATION code:", error); 35 break; 36 case gl.INVALID_FRAMEBUFFER_OPERATION: 37 console.info("webgltest checkError:INVALID_FRAMEBUFFER_OPERATION code:", error); 38 break; 39 case gl.OUT_OF_MEMORY: 40 console.info("webgltest checkError:OUT_OF_MEMORY code:", error); 41 break; 42 case gl.CONTEXT_LOST_WEBGL: 43 console.info("webgltest checkError:CONTEXT_LOST_WEBGL code:", error); 44 break; 45 default: 46 console.info("webgltest checkError:Unknow Error code:", error); 47 break; 48 } 49 return error; 50} 51export function wait(ms) { 52 return new Promise((resolve, reject) => { 53 setTimeout(() => { 54 console.log("Done waiting"); 55 resolve(ms); 56 }, ms); 57 }); 58} 59export function createProgram(gl, vSource, fSource, beforeLink) { 60 let createShader = (gl, type, source) => { 61 let shader = gl.createShader(type); //创建顶点着色器 62 if (shader == null) { 63 console.log('unable to create shader'); 64 return null; 65 } 66 gl.shaderSource(shader, source); //设置着色器代码 67 gl.compileShader(shader); //编译 68 let shaderParameter = gl.getShaderParameter(shader, gl.COMPILE_STATUS); 69 if (!shaderParameter) { //如果编译失败 70 let error = gl.getShaderInfoLog(shader); 71 console.log('failed to compile shader: ' + error); 72 gl.deleteShader(shader); //删除着色器 73 return null; 74 } 75 return shader; 76 }; 77 let vertexShader = createShader(gl, gl.VERTEX_SHADER, vSource); 78 let fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fSource); 79 if (!vertexShader || !fragmentShader) { 80 console.log('failed to link program'); 81 return null; 82 } 83 let program = gl.createProgram(); 84 if (!program) { 85 console.log('failed to link program'); 86 return null; 87 } 88 gl.attachShader(program, vertexShader); 89 gl.attachShader(program, fragmentShader); 90 if (beforeLink && beforeLink instanceof Function) { 91 beforeLink(program); 92 } 93 gl.linkProgram(program); 94 let linked = gl.getProgramParameter(program, gl.LINK_STATUS); 95 if (!linked) { 96 let error = gl.getProgramInfoLog(program); 97 console.log('failed to link program: ' + error); 98 gl.deleteProgram(program); 99 gl.deleteShader(fragmentShader); 100 gl.deleteShader(vertexShader); 101 return null; 102 } 103 gl.useProgram(program); 104 gl.program = program; 105 return { 106 program, vertexShader, fragmentShader 107 }; 108} 109