{
const { gl } = webglDrawer;
function createShaderProgram() {
const SHADER_PROGRAM = gl.createProgram(),
{ vert, frag } = shaderSource;
const shader_vertex = bindShader(vert, gl.VERTEX_SHADER, gl),
shader_fragment = bindShader(frag, gl.FRAGMENT_SHADER, gl);
gl.attachShader(SHADER_PROGRAM, shader_vertex);
gl.attachShader(SHADER_PROGRAM, shader_fragment);
gl.linkProgram(SHADER_PROGRAM);
const _color = gl.getAttribLocation(SHADER_PROGRAM, "color"),
_position = gl.getAttribLocation(SHADER_PROGRAM, "position"),
_radian = gl.getUniformLocation(SHADER_PROGRAM, "radian");
gl.enableVertexAttribArray(_color);
gl.enableVertexAttribArray(_position);
gl.enableVertexAttribArray(_radian);
gl.useProgram(SHADER_PROGRAM);
return { SHADER_PROGRAM, _position, _color, _radian };
}
/** ========================= Create buffers for vertex and fragment =========================
* Create buffers for vertex and fragment
*/
function createTriangleFace(triangle_vertex, triangle_fragment) {
// Vertex:
const TRIANGLE_VERTEX = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, TRIANGLE_VERTEX);
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array(triangle_vertex),
gl.STATIC_DRAW
);
// Fragment:
const TRIANGLE_FRAGMENT = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, TRIANGLE_FRAGMENT);
gl.bufferData(
gl.ELEMENT_ARRAY_BUFFER,
new Uint16Array(triangle_fragment),
gl.STATIC_DRAW
);
return { TRIANGLE_VERTEX, TRIANGLE_FRAGMENT };
}
/** ========================= Create buffers for vertex and fragment =========================
* Bind parameters for vertex and fragment
*/
function bindParameters(triangle_vertex, triangle_fragment) {
// Create SHADER_PROGRAM
const { SHADER_PROGRAM, _position, _color, _radian } =
createShaderProgram();
const { TRIANGLE_VERTEX, TRIANGLE_FRAGMENT } = createTriangleFace(
triangle_vertex,
triangle_fragment
);
// The 4 refers 4 bytes per number
gl.vertexAttribPointer(_position, 2, gl.FLOAT, false, 4 * (2 + 3), 0);
gl.vertexAttribPointer(_color, 3, gl.FLOAT, false, 4 * (2 + 3), 4 * 2);
return { _radian, TRIANGLE_VERTEX, TRIANGLE_FRAGMENT };
}
// Binds with triangle
const triangle_vertex = [],
triangle_fragment = [0, 1, 2];
triangle_fragment.map((i) => {
attributes.position[i].map((d) => triangle_vertex.push(d));
attributes.color[i].map((d) => triangle_vertex.push(d));
});
const { _radian, TRIANGLE_VERTEX, TRIANGLE_FRAGMENT } = bindParameters(
triangle_vertex,
triangle_fragment
);
{
// Clear the scene
gl.clearColor(0, 0.1, 0.26, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// The radian is a float
gl.uniform1f(_radian, radian);
// Real draw
gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0);
gl.flush();
}
return triangle_vertex;
}