webgl绘制一个点

WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染(部分计算GPU),这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。总结一下,WebGL的本质 —— JavaScript操作OpenGL接口
JavaScript操作一些OpenGL接口,也就意味着,可能会编写一部分GLSL ES 2.0的代码,WebGL只是绑定了一层,内部的一些核心内容,如着色器,材质,灯光等都是需要借助GLSL ES语法来操作的.

image.png

WebGL / OpenGL 之间的关系?

image.png

•OpenGL(Open Graphics Library) 一种图形应用程序编程接口规范(Application Programming Interface,API)。它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,完全通过软件的方式实现OpenGL的接口。•OpenGL ES(embedded system) OpenGL ES是OpenGL的一个特殊版本,主要针对嵌入式设备使用,专用于嵌入式计算机、智能手机、家用游戏机等设备。OpenGL ES 2003-2004年被首次提出来,其中两次重要升级分别在2007年(OpenGL ES 2.0)和2012年(OpenGL ES 3.0),WebGL就是基于OpenGL ES 2.0的。

绘制流程

  var canvas = document.getElementById("canvas");
   gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
 //指定一个覆盖(清空)canvas的rgba颜色,本质是setColor,它把背景色存到了webgl system中的glCOLOR_BUFFER_BIT,需要render一下
   gl.clearColor(0.0,0.0,0.5,1.0)
 //清除canvas,会清除全部,再使用背景色 填充
   gl.clear(gl.COLOR_BUFFER_BIT)
image.png

结论:

  1. WebGL需要依赖canvas这个载体获取对应的绘图上下文

  2. WebGL API基于OpenGL ES,函数命名相对应

  3. WebGL基于多缓冲区模型

绘制一个点

如果类似canvas 2d的话,你可能以为WebGL绘制一个点:

gl.drawColor(1.0,1.0,1.0,1.0)//点的颜色
gl.drawPoint(0,0,0,10)//点的位置大小

类似这样就可以了,不幸的是:WebGL依赖于一种着色器(shader)的绘图机制,复杂而强大,着色器是 WebGL的核心机制。WebGL中着色器程序可以写成字符串变量:

//着色器运行在WebGL系统中,而不是JS程序
 //创建顶点着色器 描述顶点特性(位置,尺寸)
 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';

着色器中包含几个内置变量:gl*Position, gl*PointSize, gl_FragColor

着色器语言中涉及到vec4的数据类型,此数据类型是一个思维浮点数组,所以其值不可以是整形如(1,1,1,1),正确应为:****(1.0,1.0,1.0,1.0)

  • gl_Position: 为一种vec4类型的变量,且必须被赋值。四维坐标矢量,我们称之为齐次坐标,即(x,y,z,w)等价于三维左边(x/w,y/w,z/w),w相当于深度,没有特殊要求设置为1.0即可。

  • gl_PointSize:表示顶点的尺寸,也是浮点数,为非必填项,如果不填则默认显示为1.0。

  • gl_FragColor:该变量为片元着色器唯一的内置变量,表示其颜色,也是一个vec4类型变量,分别代表(R,G,B,A),不过颜色范围是从0.0-1.0对应Javascript中的#00-#FF

     有了着色器我们就可以着手去绘制图像了,既然绘制3D图形,必然会有对应的三维坐标系,WebGL采用右手坐标系,如图所示:
    
image.png
var program = gl.createProgram();
 // 创建顶点着色器 
 var vShader = gl.createShader(gl.VERTEX_SHADER);
 // 创建片元着色器 
 var fShader = gl.createShader(gl.FRAGMENT_SHADER);
 // shader容器与着色器绑定 
 gl.shaderSource(vShader, VSHADER_SOURCE);
 gl.shaderSource(fShader, FSHADER_SOURCE);
 // 将GLSE语言编译成浏览器可用代码 
 gl.compileShader(vShader);
 gl.compileShader(fShader);
 // 将着色器添加到程序上 
 gl.attachShader(program, vShader);
 gl.attachShader(program, fShader);
 // 链接程序,在链接操作执行以后,可以任意修改shader的源代码,
 //对shader重新编译不会影响整个程序,除非重新链接程序 
 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);
image.png

光栅化

顶点着色器的信息在传递给OpenGL底层绘制的时候,会先进行光栅化,也就是把点转化成对应的像素。然后在片元着色器会逐个点进行渲染,最终就达到了视觉看到的效果。


image.png

点也是一样,会将点转变成多个像素点,所以要变成圆点,需要如下的方式


image.png

我们需要在片元着色器中来处理,将非原型区域的像素点,不用片元着色器来绘制,着色器需要判断距离圆点的位置超过0.5的话,就忽略此片元点,最终就会出现一个圆点的效果。
var FSHADER_SOURCE = `
 \#ifdef GL_ES
   precision mediump float;
 \#endif
 void main() {
  float d = distance(gl_PointCoord, vec2(0.5,0.5));
   if(d < 0.5){
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
   }else{ discard;} 
 }`;

webgl现状

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容

  • 谈起WebGL可能有一些人比较陌生,实际上WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript...
    三石青韦阅读 18,194评论 2 11
  • 改革开发40年以来,世界日新月异,无论从生活到精神上都有了颠覆性的变化,曾经教授还是教书的,砖家还叫专家,太阳还不...
    三石青韦阅读 40,284评论 -1 24
  • 一、我们讲什么? 我们讲两个东西: 1、WebGL背后的工作原理是什么? 2、以Three.js为例,讲述框架在背...
    无言以越阅读 1,532评论 1 6
  • 本文首发于个人博客:Lam's Blog - 【OpenGL ES】入门及绘制一个三角形,文章由MarkDown语...
    格子林ll阅读 7,252评论 2 18
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,529评论 28 53