UNPKG

clay-core

Version:

Provide a more friendly web-side drawing interface!

46 lines (43 loc) 1.87 kB
/** * 着色器一些公共的方法 * -------------------------------------------- * 主要是和生成特定着色器无关的方法 * 着色器分为二类:顶点着色器 + 片段着色器 * 前者用于定义一个点的特性,比如位置,大小,颜色等 * 后者用于针对每个片段(可以理解为像素)进行处理 * * 着色器采用的语言是:GLSL ES语言 */ // 把着色器字符串加载成着色器对象 var _loadShader = function (gl, type, source) { // 创建着色器对象 var shader = gl.createShader(type); if (shader == null) throw new Error('Unable to create shader!'); // 绑定资源 gl.shaderSource(shader, source); // 编译着色器 gl.compileShader(shader); // 检测着色器编译是否成功 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Failed to compile shader:' + gl.getShaderInfoLog(shader)); return shader; }; // 初始化着色器 var _useShader = function (gl, vshaderSource, fshaderSource) { // 分别加载顶点着色器对象和片段着色器对象 var vertexShader = _loadShader(gl, gl.VERTEX_SHADER, vshaderSource), fragmentShader = _loadShader(gl, gl.FRAGMENT_SHADER, fshaderSource); // 创建一个着色器程序 var glProgram = gl.createProgram(); // 把前面创建的二个着色器对象添加到着色器程序中 gl.attachShader(glProgram, vertexShader); gl.attachShader(glProgram, fragmentShader); // 把着色器程序链接成一个完整的程序 gl.linkProgram(glProgram); // 检测着色器程序链接是否成功 if (!gl.getProgramParameter(glProgram, gl.LINK_STATUS)) throw new Error('Failed to link program: ' + gl.getProgramInfoLog(glProgram)); // 使用这个完整的程序 gl.useProgram(glProgram); return glProgram; };