读书笔记:webGL编程指南

第二章:入门

canvas标签的使用

通过实例说明:

在浏览器上绘制一个蓝色的矩形,关键点:

  1. 在HTML中定义canvas标签,用id标记它。
  2. 在HTML中插入js脚本,指定Body的Load函数。
  3. 在js脚本中获取canvas元素。
  4. 向该元素请求二维图形的“绘图上下文”。
  5. 在绘图上下文上调用相应的绘图函数,绘制二维图形。

两个文件分别命名为canvas.html, canvas.js。

<html>
    <head>
        <title>Test canvas</title>
    </head>
    <body onload="main()">
        <canvas id="example" width="400" height="400"></canvas>
        <script src="canvas.js"></script>
    </body>
</html>
function main(){
    var canvas=document.getElementById('example');
    if(!canvas){
        console.log('can not find canvas');
        return;
    }

    //获取绘图上下文
    var ctx=canvas.getContext('2d');

    //绘制蓝色矩形
    //指定蓝色
    ctx.fillStyle='rgba(0,0,255,1.0)';
    //用颜色填充
    ctx.fillRect(120,10,150,150);
}

在这里插入图片描述

Hello webGL

实例:
用背景色清空canvas标签的绘图区。(实际上达成了用背景色填充绘图区的效果)
关键点:

  1. 获取canvas元素
  2. 获取webGL绘图上下文
  3. 设置背景色
  4. 清空canvas
<html>
    <head>
        <title>Hello WebGL</title>
    </head>
    <body onload="main()">
        <canvas id="webgl" width="400" height="400"></canvas>
    <script src="../lib/webgl-utils.js"></script>
    <script src="../lib/webgl-debug.js"></script>
    <script src="../lib/cuon-utils.js"></script>
    <script src="canvas.js"></script>
    </body>
</html>
function main(){
    var canvas=document.getElementById('webgl');

    //获取WebGl绘图上下文
    var gl=getWebGLContext(canvas);
    if(!gl){
        console.log('failed to get WebGL context');
        return;
    }
    
    //指定清空canvas的颜色
    gl.clearColor(0,0,0,1);

    //清空canvas
    gl.clear(gl.COLOR_BUFFER_BIT);
}

这就是最简单的webGL程序了,通过网站链接获得必要的依赖,并调整引用路径。
在这里插入图片描述
注:

  1. 为了在不同浏览器通用,作者使用了自定义的getWebGLContext方法,而非canvas.getContext()。
  2. 清空canvas使用了gl.clear(gl.COLOR_BUFFER_BIT); 这看似与canvas无关,实际上参数gl.COLOR_BUFFER_BIT在告诉webGL,清空颜色缓冲区(而不是其他),这将导致canvas区域颜色被清空。

绘制一个点

实例:
在原点绘制一个10像素大小的红点。
本节开始使用着色器,webGL要求两种着色器:

  1. 顶点着色器:描述顶点特性,比如位置,颜色
  2. 片元着色器:片元是图形绘制的单元。进行逐片元处理过程。

执行过程:浏览器执行js程序,执行webGL相关方法,两个着色器工作,逐顶点,逐片元操作,渲染到颜色缓冲器,显示。
关键点:

  1. 获取canvas元素
  2. 获取webGL绘图上下文
  3. 初始化着色器
  4. 设置背景色
  5. 清空canvas
  6. 绘图
<html>
    <head>
        <title>RED POINT</title>
    </head>
    <body onload="main()">
        <canvas id="webgl" width="400" height="400"></canvas>
    <script src="../lib/webgl-utils.js"></script>
    <script src="../lib/webgl-debug.js"></script>
    <script src="../lib/cuon-utils.js"></script>
    <script src="canvas.js"></script>
    </body>
</html>
//顶点着色器
var VSHADER_SOURCE = 
  'void main() {\n' +
  '  gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n' + // 坐标
  '  gl_PointSize = 10.0;\n' +                    // 点大小
  '}\n';

// 片元着色器
var FSHADER_SOURCE =
  'void main() {\n' +
  '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + // 颜色
  '}\n';

function main(){
    var canvas=document.getElementById('webgl');

    var gl=getWebGLContext(canvas);
    if(!gl){
        console.log('failed to get webgl context');
        return;
    }

    //初始化着色器
    if(!initShaders(gl,VSHADER_SOURCE,FSHADER_SOURCE)){
        console.log('failed to init shaders');
    }

    //设置canvas的背景色
    gl.clearColor(0,0,0,1);

    //清空canvas
    gl.clear(gl.COLOR_BUFFER_BIT);

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

}

应该实际键入一下代码,没有联想输入是比较容易出错的。
注:

  1. initShaders()将字符串形式的着色器代码传给WebGL,并建立着色器,它将运行在WebGL系统中(而非js程序中)。

  2. WebGL程序包括运行在浏览器中的js程序和运行在WebGL系统中的着色器程序,他们是协同运行的。

  3. 与js不同,着色器语言是强类型的,因此,你不能在要求10.0的地方,使用10来代替!

  4. 齐次坐标:你注意到点坐标是四维的,这是齐次坐标。四维的(x, y, z, w)等效于三维(x/w, y/w, z/w),为了方便用矩阵乘法描述顶点变换而引入。

  5. 片元可以理解为显示在屏幕上一个像素,本节中它控制了颜色。片元着色器在顶点着色器执行完毕后执行,获取顶点着色器赋值的gl_Position, gl_PointSize。

  6. gl.draws(mode,first,count) mode: 绘制模式/形状,first:从哪个顶点开始绘制,count: 绘制需要用到多少个顶点。在绘制过程中,顶点着色器执行count次。

  7. webGL默认的z轴,从纸面向外为z增加方向。

从js向着色器传递数据

待续


个人笔记,仅供参考,如有错误,恳请在评论区指出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基本信息 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田浩一,罗杰.李) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121229428 上架时间:2014-6-11 出版日期:2014 年6月 开本:16开 页码:470 版次:1-1 ---------------------------------------- 目录 《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结 7 第2 章 WebGL 入门 9 Canvas 是什么? 10 使用[canvas] 标签 11 DrawRectangle.js 13 最短的WebGL 程序:清空绘图区 16 HTML 文件(HelloCanvas.html) 16 JavaScript 程序(HelloCanvas.js) 17 用示例程序做实验 22 绘制一个点(版本1) 22 HelloPoint1.html 24 HelloPoint1.js 24 着色器是什么? 25 使用着色器的WebGL 程序的结构 27 初始化着色器 29 顶点着色器 31 片元着色器 33 绘制操作 34 WebGL 坐标系统 35 用示例程序做实验 37 绘制一个点(版本2) 38 使用attribute 变量 38 示例程序(HelloPoint2.js) 39 获取attribute 变量的存储位置 41 向attribute 变量赋值 42 gl.vertexAttrib3f() 的同族函数 44 用示例程序做实验 45 通过鼠标点击绘点 46 示例程序(ClickedPoints.js) 47 注册事件响应函数 48 响应鼠标点击事件 50 用示例程序做实验 53 改变点的颜色 55 示例程序(ColoredPoints.js) 56 uniform 变量 58 获取uniform 变量的存储地址 59 向uniform 变量赋值 60 gl.uniform4f() 的同族函数 61 总结 62 第3 章 绘制和变换三角形 63 绘制多个点 64 示例程序(MultiPoint.js) 66 使用缓冲区对象 69 创建缓冲区对象(gl.createBuffer()) 70 绑定缓冲区(gl.bindBuffer()) 71 向缓冲区对象中写入数据(gl.bufferData()) 72 类型化数组 74 将缓冲区对象分配给attribute 变量(gl.vertexAttribPointer()) 75 开启attribute 变量(gl.enableVertexAttribArray()) 77 gl.drawArrays() 的第2 个和第3 个参数 78 用示例程序做实验 79 Hello Triangle 80 示例程序(HelloTriangle.js) 80 基本图形 82 用示例程序做实验 83 Hello Rectangle(HelloQuad) 84 用示例程序做实验 85 移动、旋转和缩放 86 平移 87 示例程序(TranslatedTriangle.js) 88 旋转 91 示例程序(RotatedTriangle.js) 93 变换矩阵:旋转 97 变换矩阵:平移 100 4×4 的旋转矩阵 101 示例程序(RotatedTriangle_Matrix.js) 102 平移:相同的策略 105 变换矩阵:缩放 106 总结 108 第4 章 高级变换与动画基础 109 平移,然后旋转 109 矩阵变换库:cuon-matrix.js 110 示例程序(RotatedTriangle_Matrix4.js) 111 复合变换 113 示例程序(RotatedTranslatedTriangle.js) 115 用示例程序做实验 117 动画 118 动画基础 119 示例程序(RotatingTriangle.js) 119 反复调用绘制函数(tick()) 123 按照指定的旋转角度绘制三角形(dr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值