create shader program
- create a shader, to create a shader use
gl.createShader(${shaderType})
, shader have two type gl.VERTEX_SHADER
and gl.FRAGMENT_SHADER
- load shader source code,
gl.shaderSource(${shader}, ${source})
, which shader is the shader create from first step from gl.createShader
, the source is GLSL source code string. - compile the shader
gl.compileShader(${shader})
- when we have vertex shader and fragment shader, we have to create and compile for each of them
- create the shader program
gl.createProgram()
- attach the shader to program
gl.attachShader(${program}, ${shader})
- link the program to webgl context
gl.linkProgram(${program})
- finaly use the shader program in drawing loop,
gl.useProgram(${program})
const VERT_SRC = `
precision mediump float;
void main() {
gl_FragColor = vec4(1, 0, 0, 1);
}
`
const FRAG_SRC = `
attribute vec2 position;
void main() {
gl_Position = vec4(position,0,1);
}
`
let shaderProgram
function init(gl) {
const vertexShader = loadShader(gl, gl.VERTEX_SHADER, VERT_SRC)
const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC)
shaderProgram = gl.createProgram()
gl.attachShader(shaderProgram, vertexShader)
gl.attachShader(shaderProgram, fragmentShader)
gl.linkProgram(shaderProgram)
}
function draw(gl) {
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
gl.clearColor(0,0,0,1)
gl.clear(gl.COLOR_BUFFER_BIT)
gl.useProgram(shaderProgram)
}
function loadShader(gl, type, source) {
const shader = gl.createShader(type)
gl.getShaderSource(shader, source)
gl.compileShader(shader)
if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error("Error compiling shader:", gl.getShaderInfoLog(shader))
}
return shader
}