WebGL入门---编写第一个 WebGL 程序


WebGL 应用包含两个要素:JavaScript程序和着色器程序。本节我们通过绘制一个点来演示这个过程,麻雀虽小,但五脏俱全。使用 WebGL 绘制一个点虽然简单,但是它仍需要 JavaScript 程序和着色器程序共同完成。
我们的目标是绘制一个在屏幕中心,大小为 10,颜色是红色的点。

1、准备着色器源码

我们从着色器程序开始入手,先用GLSL编写顶点着色器和片元着色器。

  • 顶点着色器

顶点着色器的主要任务是告诉 GPU 在裁剪坐标系的原点(也就是屏幕中心)画一个大小为 10 的点。

void main(){
    //声明顶点位置
    gl_Position = vec4(0.0, 0.0, 0.0, 1.0); // 分号不能少,要不然编译有问题
    //声明待绘制的点的大小。
    gl_PointSize = 10.0; // 分号不能少,要不然编译有问题
}
  • 片元着色器

顶点着色器中的数据经过图元装配和光栅化之后,来到了片元着色器,在本例中,片元着色器的任务是通知 GPU 将光栅化后的像素渲染成红色,所以片元着色器要对内置变量 gl_FragColor (代表像素要填充的颜色)进行赋值。

void main(){
    //设置像素的填充颜色为红色。
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);  // 分号不能少,要不然编译有问题
}

2、准备 HTML 文件

目前的html页面代码如下




    
    
    
    从一个点开始


    
    
    


3、JavaScript 程序

获取canvas对象下的WEBGL环境

var canvas = document.querySelector('#canvas');
//在某些浏览器中,我们还需要做下兼容处理,加上实验前缀。
var gl = canvas.getContext('webgl') || canvas.getContext("experimental-webgl");

创建顶点着色器对象:

// 获取顶点着色器源码
var vertexShaderSource = document.querySelector('#vertexShader').innerHTML;
// 创建顶点着色器对象
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
// 将源码分配给顶点着色器对象
gl.shaderSource(vertexShader, vertexShaderSource);
// 编译顶点着色器程序
gl.compileShader(vertexShader);

接下来,创建片元着色器,该过程和顶点着色器的创建过程类似,区别在于着色器源码和着色器类型。

// 获取片元着色器源码
var fragmentShaderSource = document.querySelector('#fragmentShader').innerHTML;
// 创建片元着色器程序
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
// 将源码分配给片元着色器对象
gl.shaderSource(fragmentShader, fragmentShaderSource);
// 编译片元着色器
gl.compileShader(fragmentShader);

着色器对象创建完毕,接下来我们开始创建着色器程序

//创建着色器程序
var program = gl.createProgram();
//将顶点着色器挂载在着色器程序上。
gl.attachShader(program, vertexShader); 
//将片元着色器挂载在着色器程序上。
gl.attachShader(program, fragmentShader);
//链接着色器程序
gl.linkProgram(program);
// 使用刚创建好的着色器程序。
gl.useProgram(program);

准备工作做好了,接下来开始绘制:

//设置清空画布颜色为黑色。
gl.clearColor(0.0, 0.0, 0.0, 1.0);

//用上一步设置的清空画布颜色清空画布。
gl.clear(gl.COLOR_BUFFER_BIT);

//绘制点。
gl.drawArrays(gl.POINTS, 0, 1);

完整的html代码如下




    
    
    
    从一个点开始


    
    
    
    


重复代码的封装




    
    
    
    从一个点开始


    
    
    

    
    


相关