WebGL01
WebGL是什么
我们通过 js + GLSL 就可以实现在浏览器中实现2D和3D效果。
WebGL三要素
了解WebGL的运行机制。
- canvas画布元素
- JavaScript
- GLSL ES(着色器语言)
canvas元素的width、height属性指定其绘制图像的区域。
WebGL程序
WebGL并没有直接提供对应的绘图api供我们调用,需要我们自己编写一个着色器的程序,也就是GLSL。
- 获取对应WebGL的绘图环境
// html 标签
<canvas id="canvas"></canvas>
// 获取 canvas
const canvas = document.querySelector('#canvas')
// 获取 WebGL 的绘图上下文(传入的参数是 webgl
const gl = canvas.getContext('webgl')
- js相关逻辑 创建顶点着色器、片元着色器、创建GLSL着色程序
// 创建顶点着色器
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexCode)
// 创建片元着色器
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentCode)
// 创建 GLSL 着色程序
createProgram(gl, vertexShader, fragmentShader)
- GLSL ES 着色器
const vertexCode = `
void main () {
// 顶点坐标
gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
// 顶点渲染像素大小
gl_PointSize = 24.0;
}
`
const fragmentCode = `
void main () {
// 顶点颜色——蓝色
gl_FragColor = vec4(0.0, 0.0, 0.9, 1.0);
}
`
着色器代码最后会交由GPU进行执行。 示例 绘制一个点
var canvas = document.getElementById("canvas");
canvas.width = canvas.height = 600;
const gl = canvas.getContext("webgl");
const vertexCode = `
void main () {
// 顶点坐标
gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
// 顶点渲染像素大小
gl_PointSize = 10.0;
}
`;
const fragmentCode = ` void main () {
// 顶点颜色——蓝色 (R, G, Bule, A)
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
`;
//着色器代码的初始化
// 绘制实现
// var canvas = document.getElementById("redFn").addEventListener("click",()=>{
// gl.clearColor(1.0,0.0,0.0,1.0)
// gl.clear(gl.COLOR_BUFFER_BIT)
// });
function createShader({ glslCode, type }) {
// 创建对应类型着色器
const shader = gl.createShader(type);
// 传入对应着色器代码
gl.shaderSource(shader, glslCode);
// 编译着色器
gl.compileShader(shader);
return shader;
}
// 创建顶点着色器
const vertexShader = createShader({
glslCode: vertexCode,
type: gl.VERTEX_SHADER
});
// 创建片元着色器
const fragmentShader = createShader({
glslCode: fragmentCode,
type: gl.FRAGMENT_SHADER
});
// 创建着色器程序
const program = gl.createProgram();
// 分别添加两个着色器 gl.attachShader
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
// 链接两个着色器
gl.linkProgram(program);
gl.useProgram(program);
gl.drawArrays(gl.POINTS, 0, 1);
WebGL坐标系
其坐标原点在中心位置,表示单位使用-1到1以对应画布的像素尺寸一半为基准比例。
写在最后
未完待续…
希望大家好好生活,健康快乐。