clay-core
Version:
Provide a more friendly web-side drawing interface!
46 lines (43 loc) • 1.87 kB
JavaScript
/**
* 着色器一些公共的方法
* --------------------------------------------
* 主要是和生成特定着色器无关的方法
* 着色器分为二类:顶点着色器 + 片段着色器
* 前者用于定义一个点的特性,比如位置,大小,颜色等
* 后者用于针对每个片段(可以理解为像素)进行处理
*
* 着色器采用的语言是: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;
};