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

(一)Html5新功能

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

(二)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的布局与解局。

时间: 2024-11-17 09:56:03

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

15. Html5的局:WebGL的纹理格式的转换

紧接上文 WebKit为了统一WebGL的书写规范,对OpenGL的标准进行四书五入,推出了平台无关的API标准,同时为了简化底层硬件的差异,又新增了一些纹理格式的支持,由内核提供高性能的图像转换,扩展了OpenGL得标准. 那么,WebGL在底层做了些什么呢?复杂吗?可以自己实现吗? 纹理格式转换计算量大 这是WebGL为前端同学提供的福利,上层开发可以更加专注业务书写,充分挖掘C/C++语言的能力. UNPACK_FLIP_Y_WEBGL 重新生成一张内存图片,将纹理像素上下颠倒的复制到新图

19. Html5的局: 手把手写一个100行的VR程序

紧接上文 WebVR扩展了WebGL的标准,增加了HMD.PS等组件,让开发者可以在H5上开发VR程序.高级VR设备往往拥有了比手机更高精度的传感器.显示器.GPU等,让用户可以更加真实的感受虚拟世界.本节是<Html5的局>最后一节,我们手把手的写一段VR代码,感受WebVR的便捷. 本次Demo所需二维码 用户可以本地启动HTTP服务,将URL填写到播放路径 3D地球 环境准备 Three.js 到http://www.threejs.org下载最新源码,这里使用three.min.js作

背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换

原文:背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 [源码下载] 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 作者:webabcd 介绍背水一战 Windows 10 之 绑定 DataContextChanged - FrameworkElement 的 Data

14. Html5的局:WebGL的纹理格式

紧接上文 WebGL作为通用的标准,屏蔽了一些硬件厂商的高级特性,有舍就会有取,那么在一些比较常用的功能上,如果硬件无法满足通用,那么就会通过CPU来弥补硬件的不足. 图片的纹理格式,就是其中的一个点. 常见的纹理格式 我们引用12章:WebGL跨平台的取与舍的图片: 这些在OpenGL平台都是支持的,但在WebGL中做了裁剪. 裁剪了纹理格式 这些格式在FireFox中严格的不支持,但在WebKit中,WebKit虽然在代码上支持了这些格式,最终是否支持,看各个平台的硬件特性了. 裁剪了纹理的

12. Html5的局:WebGL跨平台的取与舍

紧接上文 在阅读WebKit源码中,讨论了Canvas在iOS平台使用的CoreGraphics框架作为渲染的工具,它运行在CPU上.WebGL是直接运行在GPU上的API,因此优化空间更大,对程序员要求更高.这次我们看看,WebGL如何对格式转换的,为我们后续three.js导入数据模型做铺设. 常见的纹理格式 OpenGL ES2.0在多终端的差异 在WebKit中,默认支持纹理格式,主要有: 现实却是很残酷,iOS设备以上格式都是支持的,Android设备差异化就不同了,简单的说,要想确认

在支持HTML5的浏览器上运行WebGL程序的方法

  前提条件和预期结果 目前只有少数的浏览器支持 WebGL ,请看我的另外一篇文章:Can I use WebGL?. 下面的例子是在 Windows 下的 Chrome 16/23 以及 Android 下的 Firefox 17 进行测试.如果你使用的是非兼容浏览器访问则会弹出一个警告. 图1:包含 Hello world 文本的动画的 WebGL 立方体 在兼容 HTML5 的浏览器上,你将会看到如下图所示的带动画效果的立方体: 图2: 示例运行的屏幕截图 该代码基于 Lighting

17. Html5的局: VR全景分屏视频距离我们有多远?

紧接上文 WebGL+WebVR可以轻松打造出一款VR游戏,而且整个游戏代码竟然可以精简到100k以内,加上JS及时编译和调试的特性,打造一款简单的3D场景,要比U3D这种Native方式廉价.高效很多. U3D作为传统的Native引擎,包体动辄几十M,使用C/C++.C#等编译语言,效率明显不如JS+Chrome,不过好处十分明显,运行性能良好. 本次Demo二维码: 依旧800k的APK,包含VR游戏与VR视频,进一步完善了WebVR的兼容性: 使用WebGL+WebVR做VR视频 常见的

18. Html5的局: 用WebVR来解释小米VR眼镜

紧接上文 WebVR使用跨平台H5技术,降低了开发者的技术门槛,提升了开发效率,我们来做个VR的Demo如何?本周小米发布了VR头盔,头盔还自带芯片,那又是什么呢? 本次Demo二维码 依旧800k,这次可以支持URL在线播放WebVR的程序了. WebGL+WebVR+Three.js JS常见的3D引擎框架 Three.js 浏览器常见的3D动画引擎,居于WebGL的渲染技术,整合了常见的精灵.纹理.异步加载.动画.场景.骨骼等等,无需安装IDE,直接在浏览器上开发即可,目前网上已经有许多在

HTML5(目前)无法帮你实现的五件事

一直以来,很多人都专注于HTML5能够实现什么(或者是如何将各种方法连接起来,实现一个更加优雅的解决方案).而现在,也不少人想将目光投向那些HTML5无法实现的事情.MSDN上微软员工thebeebs的一篇博文回答了这个问题: 1:HTML5无法实现DRM 如果你有一家多媒体公司,你需要控制或者限制你的视频内容--通常是在多媒体内容中添加数字版权加密技术(DRM).不幸的是,HTML5无法加入DRM.HTML5的问题是,它会将多媒体内容的格式完全暴露出来,要解决这个问题并不困难(相关的技术和策略