10. Html5的局:这些年,WebGL替我们做的那些事

简介: ### (一)Html5新功能 最重要的功能之一当属WebGL了,和3D图形规范OpenGL、通用计算规范OpenCL一样,来自Khronos Group,2011年对外公布,到现在已经开始有WebGL2.0规范的雏形了。 这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,为Html5的Canvas提供硬件3D加速渲染,如下图所示: ![screenshot]

(一)Html5新功能

最重要的功能之一当属WebGL了,和3D图形规范OpenGL、通用计算规范OpenCL一样,来自Khronos Group,2011年对外公布,到现在已经开始有WebGL2.0规范的雏形了。
这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,为Html5的Canvas提供硬件3D加速渲染,如下图所示:
screenshotWebGL

(二)WebGL与品类繁盛的openXX家族

简单列举一下:OpenGL 1/2/3/4.. OpenGL ES 1/2/3..
简单说:

(A)OpenGL

是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。

(B)OpenGL ES

是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。

(C)WebGL

兼顾了openGL ES2.0的同时,增加了大量的扩展属性和封装API,简化了OpenGL的开发难度。

WebGL与OpenGL OpenGL ES的关联与不同

(三)WebGL与OpenGL ES 2.0相同点

(A)包含了ES2.0规范所有的常量定义:

在C/C++的宏定义中:

#define GL_DEPTH_BUFFER_BIT                              0x00000100
#define GL_STENCIL_BUFFER_BIT                            0x00000400
#define GL_COLOR_BUFFER_BIT                              0x00004000

相应的JS中,我们使用方式:

var gl = canvas.getContext('webgl');
gl.DEPTH_BUFFER_BIT
gl.STENCIL_BUFFER_BIT
gl.COLOR_BUFFER_BIT

(B)包含了ES2.0规范几乎所有的函数调用

GLenum texture = xxx;
glActiveTexture (texture);

相应的JS中,我们使用方式:

var texture = xxx;
gl.activeTexture(texture);

是不是很简单呀。
这种一对一响应的变量和API使用方式,让不少OpenGL开发者轻而易举的转移到了Html5阵营,也让那些想学OpenGL的同学,在浏览器中就可以所见既所得的开发方式,降低了准入门槛。

很多事情,我们要反过来看,如果学会了WebGL是不是就可以轻松的搞定OpenGL和OpenGL ES2.0了吗?

(四)WebGL 不等于OpenGL ES2.0

(A)WebGL的规范,要比OpenGL ES大,比OpenGL要小

OpenGL ES 2.0 < WebGL < OpenGL 3.0

比如增加了OpenGL 2.0以后版本才有的一些常量:

#define GL_PIXEL_PACK_BUFFER            0x88EB
#define GL_PIXEL_UNPACK_BUFFER          0x88EC
#define GL_PIXEL_PACK_BUFFER_BINDING    0x88ED
#define GL_PIXEL_UNPACK_BUFFER_BINDING  0x88EF

#define GL_DEPTH_STENCIL                0x84F9
#define GL_DEPTH_STENCIL_ATTACHMENT     0x821A

增加了一些WebGL特有的常量(以WebGL结尾):

#define GL_UNPACK_FLIP_Y_WEBGL                  0x9240
#define GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL       0x9241
#define GL_CONTEXT_LOST_WEBGL                   0x9242
#define GL_UNPACK_COLORSPACE_CONVERSION_WEBGL   0x9243
#define GL_BROWSER_DEFAULT_WEBGL                0x9244

增加了一些WebGL特有的API:

createBuffer
createFramebuffer
createRenderbuffer
createTexture
deleteBuffer
deleteFramebuffer
deleteRenderbuffer
……

删除OpenGL ES2.0的gen开头的所有API

genBuffers
generateMipmap
genFramebuffers
genRenderbuffers
genTextures
……

重命名了OpenGL ES2.0里以get开头,以v结尾的指针类型API:

getBufferParameteriv
getVertexAttribPointerv
……

新名称为:

getBufferParameter
getVertexAttribOffset
……

(B)扩展面向状态编程,增加面向过程、面向对象思想

每一个canvas都有一个上下文对象

var gl = canvas.getContext('webgl', attris);

canvas.getContext = function(type, attrs) {
       return new WebGLRenderingContext(attrs);
}

上下文具有生命周期:

canvas.addEventListener( 'webglcontextlost', onContextLost, false );

(C)WebGL与OpenGL的API不再一一对应

以glTexImage2D为例,OpenGL中函数定义为:

glTexImage2D(target, level, infmt, width, height, border, format, type, pixels);

在WebGL中函数发生了重载,参数个数或为6或为9

// source可以是image/video/canvas标签对象
glTexImage2D(target, level, infmt, format, type, source);
glTexImage2D(target, level, infmt, width, height, border, format, type, pixels);

(五)WebGL为什么要这样做,他做这件事的目的又是什么呢?这件事的意义又是什么?

请关注下一篇,在Html5一统前端的背景下,WebGL的布局与解局。

目录
相关文章
|
JavaScript 前端开发 Web App开发
带你读《Three. js开发指南: 基于WebGL和HTML5在网页上渲染 3D图形和动画(原书第3版)》之一:使用Three.js创建你的第一个三维场景
本书将介绍如何直在浏览器中创建漂亮的3D场景和动画,并且充分发挥WebGL和现代浏览器的潜能。首先介绍基本概念和基础组件,然后通过逐渐扩展示例代码逐步深讲解更多高级技术。在本书中读者将学到如何从外部加载3D模型和具有真实效果的材质纹理、学习使用Three.js提供的摄像机组件来实现在3D场景中飞行和走动、如何将HTML5视频和画布作为材质贴在3D模型表面。此外还将学习变形动画和骨骼动画,甚至还会涉及在场景中使用物理模拟的方法,例如重力、碰撞检测等等。
|
Web App开发 移动开发 iOS开发
如何在浏览器中启用 WebGL 以使用 HTML5 3D 查看器
如何在浏览器中启用 WebGL 以使用 HTML5 3D 查看器
785 0
|
移动开发 JavaScript 前端开发
webgl学习笔记3_javascript的HTML DOM
webgl学习笔记3_javascript的HTML DOM
261 0
webgl学习笔记3_javascript的HTML DOM
|
移动开发 监控 前端开发
基于 HTML5 WebGL 和 VR 技术的 3D 机房数据中心可视化
基于 HTML5 WebGL 和 VR 技术的 3D 机房数据中心可视化
|
存储 移动开发 数据可视化
使用 WebGL 为 HTML5 游戏创建逼真的地形
在本文中,我将分享我们应对这些有趣挑战之一的方法:一种创建逼真的大型地形的简单方法。
416 0
|
移动开发 小程序 图形学
如何在HTML5中使用WebGL实现3D效果?底层原理是什么?
如何在HTML5中使用WebGL实现3D效果?底层原理是什么?
535 0
|
JavaScript HTML5 移动开发
带你读《Three. js开发指南: 基于WebGL和HTML5在网页上渲染 3D图形和动画(原书第3版)》之三:学习使用Three.js中的光源
本书将介绍如何直在浏览器中创建漂亮的3D场景和动画,并且充分发挥WebGL和现代浏览器的潜能。首先介绍基本概念和基础组件,然后通过逐渐扩展示例代码逐步深讲解更多高级技术。在本书中读者将学到如何从外部加载3D模型和具有真实效果的材质纹理、学习使用Three.js提供的摄像机组件来实现在3D场景中飞行和走动、如何将HTML5视频和画布作为材质贴在3D模型表面。此外还将学习变形动画和骨骼动画,甚至还会涉及在场景中使用物理模拟的方法,例如重力、碰撞检测等等。
|
JavaScript HTML5 移动开发
带你读《Three. js开发指南: 基于WebGL和HTML5在网页上渲染 3D图形和动画(原书第3版)》之二:构建Three.js应用的基本组件
本书将介绍如何直在浏览器中创建漂亮的3D场景和动画,并且充分发挥WebGL和现代浏览器的潜能。首先介绍基本概念和基础组件,然后通过逐渐扩展示例代码逐步深讲解更多高级技术。在本书中读者将学到如何从外部加载3D模型和具有真实效果的材质纹理、学习使用Three.js提供的摄像机组件来实现在3D场景中飞行和走动、如何将HTML5视频和画布作为材质贴在3D模型表面。此外还将学习变形动画和骨骼动画,甚至还会涉及在场景中使用物理模拟的方法,例如重力、碰撞检测等等。
|
移动开发 HTML5 容器
基于 HTML5 WebGL 的 3D 网络拓扑结构图
现在,3D 模型已经用于各种不同的领域。在医疗行业使用它们制作器官的精确模型;电影行业将它们用于活动的人物、物体以及现实电影;视频游戏产业将它们作为计算机与视频游戏中的资源;在科学领域将它们作为化合物的精确模型;建筑业将它们用来展示提议的建筑物或者风景表现;工程界将它们用于设计新设备、交通工具、结构以及其它应用领域;在最近几十年,地球科学领域开始构建三维地质模型,而且 3D 模型经常做成动画,例如,在故事片电影以及计算机与视频游戏中大量地应用三维模型。
2392 0