WebGL编程指南一:入门

前言

WebGL被设计出来的目的,就是在网页上创建三维的应用和用户体验,它是内嵌在浏览器中的,你不必安装插件和库就可以直接使用它。它允许Javascript在网页上显示和操作三维图形。WebGL程序由HTMLT和JavaScript文件组成。WebGL页面包含三种语言:HTML5,JavaScript,和GLSL ES,而通常GLSLES是以字符创的形式写在JavaScript中的,所以实际上WebGL只需要用到HTML文件和JavaScript文件,其文件结构和传统网页一样;
WebGL程序实际上是网页的一部分,你可以充分利用浏览器的功能,比如放置按钮,弹出对话框,绘制文本,播放声音和视频,与服务器通信等等。WebGL程序允许你自由的使用这些功能。
WebGL技术规范继承自OpenGL标准,WebGL是从OpenGL ES 2.0派生出来的,采用OpenGL ES的电子设备包括智能手机(安卓和iPhone),平板电脑,游戏机等。

WebGL程序的结构

WebGL页面包含三种语言:HTML5,JavaScript,GLSL ES
在这里插入图片描述
然而,通常GLSL ES是以字符串的形式在JavaScript中编写的,实际上WebGL程序只需要用的HTML和JavaScript文件,所以WebGL仍然保持与传统网页相同的结构:只用到html和js文件;
WebGL采用HTML5引入的canvas标签,它定义了页面上的绘图区域。如果没有WebGL,Js只能在canvas上绘制二维图形,有了WebGL,就可以在上边绘制三维图形了

Canvas

在HTML5出现之前,如果想在网页上显示图形只能使用img标签,但img只能显示静态的图片,不能实时绘制和渲染。canvas的出现,允许Js动态的绘制图形。canvas提供一些简单的绘制函数,用来绘制点,线,矩形,圆等。

WebGL基本概念

  • 着色器:WebGL 依赖于一种称为着色器的绘制机制,要使用WebGL进行绘图就必须使用着色器。着色器提供灵活且强大的绘制二维或三维图形的方法,在代码中,着色器代码(GLSL ES语言)以字符串的形式嵌入到Javascript文件中,在程序真正开始运行前他就已经设置好了。
    WebGL需要两种着色器:
    1. 顶点着色器(Vertex shader):用来描述顶点特征的程序,控制点的位置和大小。顶点是指二维或三维空间中的一个点,如二维或三维图形的端点或焦点。顶点着色器程序(字符串代码)必须包含一个main()函数,main()前面的关键字void表示这个函数不会有返回值。另外,不可以为main()指定参数。
    2. 片元着色器(Fragment shader):进行逐片元处理过程如光照的程序,控制点的颜色。处理片元,使其显示在屏幕上。片元是WebGL中的术语,你可以理解为像素(图像的单元);
顶点着色器的内置变量 类型和变量名描述
vec4 gl_Position表示顶点位置
float gl_PointSize表示点的尺寸(像素数)

注意:gl_Position变量必须被赋值,否则着色器就无法正常工作,gl_PointSize不是必须的,如果不赋值,着色器会为其取默认值1.0

片元着色器的内置变量 类型和变量名描述
vec4 gl_FragColor指定片元的颜色(RGBA格式)

gl_FragColor是片元着色器唯一的内置变量,它控制像素在屏幕上最终的颜色

GLSL ES是强类型编程语言,通过为变量指定类型,系统可以轻易理解变量中存储 的是何种数据,进而优化处理这些数据:

  • GLSL ES中的变量类型
    1. float 浮点数类型
    2. vec4(v0,v1,v2,v3) 由四个浮点数组成的矢量
  • 齐次坐标
    由四个分量组成的矢量被称为齐次坐标,齐次坐标使用如下符号描述:(x,y,z,w),其次坐标(x,y,z,w)等价于三维坐标(x/w,y/w,z/w),所以如果齐次坐标的第4个分量是1,你就可以把它当做三维坐标来使用。w的值必须是大于等于0的,如果w趋近于0,那么它所表示的点将趋近无穷远。因为它能够提高处理三维数据的效率,所以在三维图形系统中被大量使用。齐次坐标的存在,使得用矩阵乘法来描述顶点变换成为可能。三维图形系统在计算过程中,通常使用齐次坐标来表示顶点的三维坐标

WebGL基本方法:

  • initShaders(gl,vshader,fshader) 在WebGL系统内部建立和初始化着色器;
    参数:
    gl 渲染上下文;
    vshader 顶点着色器的程序代码(字符串);
    fshader 片元着色器的程序代码(字符串)
    返回值:true 初始化着色器成功; false 初始化着色器失败;
  • getWebGLContext(element,[,debug]) 获取WenGL绘图上下文;
    参数:element 指定的canvas元素; debug为可选参数,默认为false,当它为true时开启调试模式。
    返回值:non-null WebFL绘制上下文; null WebGL不可用;
  • gl.clearColor(red,green,blue,alpha);
    参数:red,green,blue,颜色三原色,alpha透明度
    返回值:无
    颜色分量取值范围在0.0-1.0之间,RGB的值越高,颜色就越亮,第4分量alpha的值越高,颜色越不透明。一旦指定背景色之后,背景色就会贮存在WebGL系统中,在下一次调用gl.clearColor()方法前不会改变。
  • gl.clear(buffer) 将指定缓冲区设定为预定的值。
    参数:buffer:指定待清空的缓冲区,可选值有gl.COLOR_BUFFER_BIT(颜色缓冲),gl.DEPTH_BUFFER_BIT(深度缓冲),gl.STENCIL_BUFFER_BIT(模板缓冲)。也可使用位操作符“|”(OR)指定多个缓冲区。
    返回值:无
  • gl.drawArrays(mode,firstIndex,count) 可以用来绘制各种图形
    参数:
    mode 指定绘制的方式,可选值有gl.POINTS, gl.LINES gl.LINE_STRIP, gl.LINE_LOOP, gl.TRIANGLES,gl.TRIANGLE_STRIP,gl.TRIANGLE_FAN;
    firstIndex 指定从哪个顶点开始绘制(整型数,index);
    count 指定需要绘制多少个顶点(整型数)
    返回值:无
    当程序调用gl.drawArrays()时,顶点着色器将被执行count次,每次处理一个顶点

在这里插入图片描述
颜色缓冲区的内容会自动显示在浏览器中

最简单的webgl程序

使用webGL在canvas中绘制一个点

  • 大部分的WebGL程序都遵循这样的流程:
    => 获取canvas元素
    => 获取WebGL绘图上下文(getWebGLContext)
    => 初始化着色器(.initShaders)
    => 设置canvas背景色(.clearColor)
    => 清除canvas(.clear)
    => 绘图
  • 准备
    html文件中引入WebGL提供的工具库:webgl-utils.js,webgl-debug.js,cuon-utils.js,cuon-matrix.js

html:

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<canvas id='webgl' width='400' height='400'></canvas>

	<p id='nearFar'></p>
	<!-- 有用的类库 -->
	<script src='../libs/webgl-utils.js'></script>
	<script src='../libs/webgl-debug.js'></script>
	<script src='../libs/cuon-utils.js'></script>
	<script src='../libs/cuon-matrix.js'></script>

	<!-- 示例代码 -->
	<script src='./js/HelloCanvas.js'></script>
</body>
</html>

HelloCanvas.js:

window.onload = function () {
	// 在canvas中绘制一个点
	// 顶点着色器程序 (GLSL ES语言)
	var VSHADER_SOURCE = `void main() {\n
								gl_Position = vec4(0,0,0,1);\n
								gl_PointSize = 10.0;\n
							}
						 `
	// 片元着色器程序(GLSL ES语言)
	var FSHADER_SOURCE = `void main() {\n
								gl_FragColor = vec4(1,0,0,1);\n
							}\n`
	// 以上是以Js字符串形式编写的着色器语言程序,主程序(Js语言编写)可以将他们传给WebGL系统
	var canvas = document.getElementById('webgl');// 获取canvas标签
	var gl = getWebGLContext(canvas);//获取WebGL上下文   cuon-utils.js中提供的辅助函数,屏蔽获取WebGL上下文时不同浏览器的差异
	// 初始化着色器
	if (!gl || !initShaders(gl,VSHADER_SOURCE,FSHADER_SOURCE) {
		return;
	}
	gl.clearColor(0,0,1,1);//指定绘图区域(canvas)的背景色,参数值是rgba的值(值范围遵从OpenGL ,为0.0 - 1.0,值越高,颜色越亮,第四分量值越高,越不透明);
	gl.clear(gl.COLOR_BUFFER_BIT);//用上一行指定的背景色清空颜色缓冲区(即:用背景色填充,擦除已经绘制的内容)绘图区域
	gl.drawArrays(gl.POINTS,0,1); // 绘制点

}

绘制结果

在这里插入图片描述

WebGL程序的执行的大致流程:首先运行JavaScript程序,调用WebGL的相关方法,然后顶点着色器和片元着色器就会执行,在颜色缓冲区内进行绘制,这时就清空了绘图区,最后,颜色缓冲区中的内容会自动在浏览器的canvas标签上显示出来

注意:着色器运行在WebGL系统中,而不是JavaScript程序中。WebGL程序包括运行在浏览器中的Js和运行在WebGL系统中的着色器程序这两个部分

WebGL坐标系统

由于WebGL处理的是三维图形,所以它使用三维坐标系统(笛卡尔坐标系),具有x,y,z轴。通常在WebGL中,当你面对计算机屏幕时,X轴是水平的(正方向向右),Y轴是垂直的(正方向向下),Z轴垂直于屏幕(正方向向外)这套坐标系又称为右手坐标系(实际上WebGL本身既不是右手坐标系,又不是左手坐标系,本文以右手坐标系来讲解)
在这里插入图片描述

canvas绘制区的坐标系与WebGL坐标系统的原点位置和Y轴正方向不一样,需要将前者映射到后者。

三维场景中,仅仅用线条和颜色把图形画出来是远远不够的,你必须考虑,如光线照上去之后,或观察者的视角发生变化,对场景会有些什么影响。着色器可以高度灵活的完成这些工作,提供各种渲染效果。这也就是当今计算机制作出的三维场景如此逼真和令人震撼的原因

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 原书名: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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值