<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>画一个点</title>
    </head>
    <body onload="main()">
        <canvas id="webgl" width="200" height="200">
        </canvas>
    </body>
    <script type="text/javascript" src="webgl01.js">
    </script>
</html>
function main(){
    var canvas = document.getElementById('webgl');//获得canvas元素

    var param = ['webgl', 'experimental-webgl', 'webkit-3d', 'moz-webgl'];

    var gl;
    for (var i = 0; i < param.length; i++) {
        gl = canvas.getContext(param[i]);//创建webgl context(得到画图区域)

        if (gl) {
            break;
        }
    }

    if (!gl) {
        console.log('浏览器不支持WEBGL!');
    }

    gl.clearColor(0.0, 0.0, 0.0, 1.0);//指定颜色

    gl.clear(gl.COLOR_BUFFER_BIT);//使用指定的颜色清空画图区域

    //编写vertex shader,vertex shader指定特性(位置、大小、颜色等)
    //gl_Position指定了点的位置,在三维空间,有XYZ三个轴的坐标,最后一个是透明度,0-1,1代表完全不透明,0则是完全透明
    //vec4,是表示一个有四个参数的向量,在WebGL中均采用此类名称,vec表示vector类别,4表示接收四个参数
    //每一个参数必须是float类型的,即要加小数点,WebGL采用严格类型,不能使用整型参数
    //gl_PointSize 定义点的大小,同样是float类型
    var vShaderSource = 'void main(){ \n' +
    '    gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n' +
    '    gl_PointSize = 10.0; \n' +
    '} \n';

    //编写frament shader,可以理解成对每个像素进行处理
    //gl_FragColor接收vec4类型的参数,即RGBA,RGB为三原色,最后代表透明度
    var fShaderSource = 'void main(){ \n' +
    '    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n' +
    '} \n';

    //其实这一段非常像C,编写源代码,编译,链接...
    var vShader = gl.createShader(gl.VERTEX_SHADER);//创建shader
    gl.shaderSource(vShader, vShaderSource);//把shader source关联到shader上
    gl.compileShader(vShader);//编译shader
    var vCompiled = gl.getShaderParameter(vShader, gl.COMPILE_STATUS);

    var fShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fShader, fShaderSource);
    gl.compileShader(fShader);
    var fCompiled = gl.getShaderParameter(fShader, gl.COMPILE_STATUS);

    var program = gl.createProgram();
    gl.attachShader(program, vShader);//将编译完的vertex shader和fragment shader关联到创建的program上
    gl.attachShader(program, fShader);

    gl.linkProgram(program);//链接program
    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);

    gl.useProgram(program);

    gl.drawArrays(gl.POINTS, 0, 1);//第一个参数POINTS表示画点,第二个参数根据前面指定的gl_Position,从第0个元素开始,因为每个点需要三个坐标,即(0.0, 0.0, 0.0),第三个参数表示画一个
}

其中红色加粗的均为WebGL中的方法,为了方便理解,并未对代码结构作规划,重点在于理解WebGL。

Hello Point——WebGL的更多相关文章

  1. Webgl的2D开发方案(一)spritebatcher

    使用TypeScript 和 webgl 开发   第一步:实现了SpriteBatcher 例子如下 http://oak2x0a9v.bkt.clouddn.com/test/index.html ...

  2. HTML5 学习总结(四)——canvas绘图、WebGL、SVG

    一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...

  3. 数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇

    <数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇>一文让读者了解了 HT的 2D 拓扑图组件使用,本文将对 HT 的 3D 功能做个综合性的介绍,以便初学者可快速上手使用 HT ...

  4. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  5. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

    今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...

  6. 基于HTML5的WebGL应用内存泄露分析

    上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...

  7. 基于WebGL 的3D呈现A* Search Algorithm

    http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现 ...

  8. 20个不可思议的 WebGL 示例和演示

    WebGL 是一项在网页浏览器呈现3D画面的技术,有别于过去需要安装浏览器插件,通过 WebGL 的技术,只需要编写网页代码即可实现3D图像的展示.WebGL 可以为 Canvas 提供硬件3D加速渲 ...

  9. webgl 循环传参画10个点

    function main(){ var canvas = document.getElementById("webgl"); var gl = getWebGLContext(c ...

  10. webstorm对WebGL自动提示

    默认竟然没有勾选上,怪不得提示的时候,有很多webgl接口找不到方法(虽然可以运行).

随机推荐

  1. openWrt 安装与实践 II

    1. 启动ubuntu上面的openwrt虚拟机之后, 设置一下虚拟机的网卡: 第1个网卡: Host-only 第2个网卡: NAT 2. 查看网络配置: root@OpenWrt:/etc/con ...

  2. ThinkPHP_SQL(1)查询语言

    推荐使用索引数组或者对象来作为查询条件,因为会更加安全. 一.使用字符串作为查询条件 这是最传统的方式,但是安全性不高,例如: $User = M("User"); // 实例化U ...

  3. div高度自适应(总结:min-height:100px; height:auto;的用法)

    对于div高度自适应问题,我总是用一句话:height:auto来解决. 但是很多时候我们需要的是当div内部有内容时,高度会随着内容的增加和增加,当div中没有内容时,div能够保持一个固定的高度. ...

  4. Redis应用场景

    Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的 ...

  5. 亚马逊ec2服务器上无法使用sudo执行npm命令的解决办法

    sudo ln -s /usr/local/bin/node /usr/bin/node sudo ln -s /usr/local/lib/node /usr/lib/node sudo ln -s ...

  6. 使用servlet实现文件上传

    package com.zhanghaobo.fileupload; import java.io.File; import java.io.IOException; import java.util ...

  7. [AngularJS] Adding custom methods to angular.module

    There are situations where you might want to add additional methods toangular.module. This is easy t ...

  8. struts2+Hibernate4+spring3+EasyUI环境搭建之五:引入jquery easyui

    1.下载jquery easyui组件     http://www.jeasyui.com/download/index.php 2.解压 放到工程中  如图 3.jsp引入组件:必须按照如下顺序 ...

  9. Hibernate HQL和原生SQL查询的一点区别

    1.createSQLQuery 1.1默认查询的结果为BigDecimal 1.2通过addScalar("CGD_ID", StandardBasicTypes.LONG)可以 ...

  10. 【Java重构系列】重构31式之搬移方法

    重构第二式:搬移方法 (Refactoring 2: Move Method) 毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它 ...