写在前面

  •   WebGl(全称:Web Graphics Library : web图形库) 是基于OpenGL ES 2.0的3D绘图协议。

  •   WebGL完美地解决了现有的Web交互式三维动画的两个问题:第一,它通过HTML脚本本身实现Web交互式三维动画的制作,无需任何浏览器插件支持;第二,它利用底层的图形硬件加速功能进行的图形渲染,是通过统一的、标准的、跨平台的OpenGL接口实现的。

绘图一个点的步骤

  • 创建HTML5 canvas
<canvas id="canvas" width="200px" height="200px"></canvas>

  • 获取画布canvas的Id
var canvas = document.getElementById('canvas');

  • 获取画布webgl的上下文
var gl = canvas.getContext('webgl');

  • 编写存储着色器程序

    • 顶点着色器 :指定了点的位置和尺寸
            //顶点着色器程序
    var VSHADER_SOURCE =
    "void main() {" +
    //设置坐标
    "gl_Position = vec4(0.0, 0.0, 0.0, 1.0); " +
    //设置尺寸
    "gl_PointSize = 10.0; " +
    "} ";
    • 片元着色器 :指定了点的颜色
            //片元着色器程序
    var FSHADER_SOURCE =
    "void main() {" +
    //设置颜色
    "gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" +
    "}";
  • 编译着色器。三步曲

    • 创建Shader(着色器)对象
    Object createShader (enum type)
    
    type 两种选择 :
    gl.VERTEX_SHADER创建顶点着色器 , gl.FRAGMENT_SHADER 创建片段着色器。
    • 将前面的着色器程序绑定到Shader对象上
    shaderSource(Object shader, string source)
    shader :着色器对象
    source :着色器程序
    • 编译程序
    compileShader(Object shader)
  • 合并程序:将顶点着色器和片元着色器合并,并链接到程序中。四步走

    • 创建一个程序对象
    createProgram();
    
    
    • 附件着色器
    attachShader(Object program, Object shader);
    
    
    • 链接着色器
    linkProgram(shaderProgram);
    
    
    • 使用程序
    useProgram(shaderProgram);
    
    
  • 绘图

gl.drawArrays(gl.POINTS, 0, 1);

附上代码

html


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <canvas id="canvas" width="200px" height="200px"></canvas> </body>
</html>

javascript


<script> window.onload = function () { //顶点着色器程序
var VSHADER_SOURCE =
"void main() {" +
//设置坐标
"gl_Position = vec4(0.0, 0.0, 0.0, 1.0); " +
//设置尺寸
"gl_PointSize = 10.0; " +
"} "; //片元着色器程序
var FSHADER_SOURCE =
"void main() {" +
//设置颜色
"gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" +
"}";
//获取canvas元素
var canvas = document.getElementById('canvas');
//获取绘制webgl绘图上下文
var gl = canvas.getContext('webgl');
if (!gl) {
console.log("Failed");
return;
}
//编译着色器
// (1)创建Shader(着色器)对象
// (2)将着色器程序附加到Shader上
// (3)编译程序
var vertShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertShader, VSHADER_SOURCE);
gl.compileShader(vertShader); var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragShader, FSHADER_SOURCE);
gl.compileShader(fragShader);
//合并程序
// (1)创建一个程序对象
// (2)附加着色器
// (3)链接着色器
// (4)使用程序
var shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertShader);
gl.attachShader(shaderProgram, fragShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram); //绘制一个点
gl.drawArrays(gl.POINTS, 0, 1);
} </script>

参考文献

写在最后

  新博客

webgl学习笔记一-绘图单点的更多相关文章

  1. webgl学习笔记二-绘图多点

    写在前面 建议先看下第一篇webgl学习笔记一-绘图单点 第一篇文章,介绍了如何用webgl绘图一个点.接下来本文介绍的是如何绘制多个点.形成一个面. webgl提供了一种很方便的机制,即缓冲区对象, ...

  2. webgl学习笔记五-纹理

    写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放 术语 : 纹理 :图像 图形装配区域 :顶点着色器顶点坐标 ...

  3. webgl学习笔记四-动画

    写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放   下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘 ...

  4. webgl学习笔记三-平移旋转缩放

    写在前面 建议先阅读下前面我的两篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 平移 1.关键点说明 顶点着色器需要加上 uniform vec4 u_Translation ...

  5. WebGL学习笔记二——绘制基本图元

    webGL的基本图元点.线.三角形 gl.drawArrays(mode, first,count) first,代表从第几个点开始绘制即顶点的起始位置 count,代表绘制的点的数量. mode,代 ...

  6. WebGL学习笔记(2)

    根据上一篇学习笔记,理解WebGL的工作原理及基本调用代码后,可以开始研究3D顶点对象的缩放.旋转.以及对对象进行可交互(鼠标或键盘控制)的旋转或者缩放. 要理解对象的旋转/缩放需要首先学习矩阵的计算 ...

  7. WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制

    接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...

  8. WebGL学习笔记(四):绘图

    图元 WebGL可以绘制非常复杂的3D模型,这些模型都是由下面3种基本几何图元构成的,下面我们来详细的看看. 三角形 WebGL中任何复杂的模型,都是由三角形组合而成的,可以说三角形是任意形状的最小构 ...

  9. WebGL学习笔记一

    学习用来做web3D的,从第一页开始学起先做2D的,接下来的程序是一个入门级的程序,可以通过在画板上的不同位置点击而获取不同颜色的点,以画板中心为坐标原点四个象限有不同的颜色,访问地址  http:/ ...

随机推荐

  1. 自己第一次使用ANTLR遇到的问题

    觉得既然是第一次尝试ANTLR嘛,那就来个简单点的,parse Windows 的 hosts 文件吧,结果...... 先上一段 grammar: grammar hosts; hostfile: ...

  2. 2017-2018-1 20155321 《信息安全系统设计基础》课堂实践——实现mypwd

    2017-2018-1 20155321 <信息安全系统设计基础>课堂实践--实现mypwd 学习pwd命令 pwd命令:输出当前工作目录的绝对路径 还可通过man pwd具体查看pwd的 ...

  3. SupperSocket深入浅出(一)

    花了几天时间了解了SupperSocket工作原理,各各类之间的工作关系.SupperSocket大部资料网上都有,但写的都不适合初学者. 今天花点时间写下这几天的学习成果,一方面是为了将来更好的回顾 ...

  4. spring源码-aop-5

    一.在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

  5. CentOS 6.5关闭防火墙

    关闭命令:  service iptables stop 永久关闭防火墙:chkconfig iptables off 两个命令同时运行,运行完成后查看防火墙关闭状态 service iptables ...

  6. Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子

    在Spring,bean可以“访问”对方通过bean配置文件指定相同或不同的引用. 1. Bean在不同的XML文件 如果是在不同XML文件中的bean,可以用一个“ref”标签,“bean”属性引用 ...

  7. 移动端车牌识别/车牌OCR识别

    周末,小编约了朋友商场shopping. 开车进地下车库时,“滴”的一声,完成车牌录入:开车离开时,扫描二维码,输入车牌,完成停车收费.小编不禁感叹科技改变生活,人工智能给生活带来的便利. 车牌自动识 ...

  8. Qt 将字符串转成16进制显示

    最近项目用到了需要将字符串转换成16进制显示.这玩意折腾了一上午. 首先,数据块内容 struct UserData { char Head[3] = {'X','J','J'}; char Flag ...

  9. Unity Lighting - High Dynamic Range (HDR) 高动态范围(五)

      High Dynamic Range (HDR) 高动态范围 As well as Color Space, the ‘dynamic range’ of your camera needs to ...

  10. ES6的新特性(6)——正则的扩展

    正则的扩展 RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = ne ...