效果:

代码:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebGl 利用缓冲区对象画多个点</title>
</head>
<body> <canvas id="myCanvas" width="500" height="300" style='border:1px solid red'></canvas> </body> <script> window.onload = function () { //步骤一: 获取上下文
var myCanvas = document.getElementById('myCanvas');
var gl = myCanvas.getContext('webgl'); //步骤二: 定义三个点 ,并将其储存在缓存区对象
var vertices = [
-0.5,0.5,0.0,
0.0,0.5,0.0,
-0.25,0.25,0.0,
]; // 2.1 创建一个空的缓冲区对象来存储顶点缓冲区
var vertex_buffer = gl.createBuffer(); // 2.2 绑定缓冲区对象
gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer); // 2.3 将顶点数据传递到缓冲区
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); //步骤三: 创建和编译着色器程序
//定点着色器
var vertCode = "attribute vec3 coordinates;" +
"void main() {" +
"gl_Position = vec4(coordinates,1.0);" + //位置
"gl_PointSize = 10.0;" + //点的大小(单位像素)
"}"; //片段着色器
var fragCode = "void main() {" +
"gl_FragColor = vec4(1, 0.5, 0.0, 1);" + //RBGA值
"}"; // 3.1 创建一个顶点着色器对象、一个片段着色器对象
var vertShader = gl.createShader(gl.VERTEX_SHADER);
var fragShader = gl.createShader(gl.FRAGMENT_SHADER); // 3.2 为两个着色器附加源代码
gl.shaderSource(vertShader, vertCode);
gl.shaderSource(fragShader, fragCode); // 3.3 编译着色器
gl.compileShader(vertShader);
gl.compileShader(fragShader); // 3.4 创建要存储的着色器程序对象
var shaderProgram = gl.createProgram(); // 3.5 为着色器程序附加着色器
gl.attachShader(shaderProgram, vertShader);
gl.attachShader(shaderProgram, fragShader); // 3.6 链接两个着色器
gl.linkProgram(shaderProgram); // 3.7 使用组合着色器程序对象
gl.useProgram(shaderProgram); //步骤四: 关联着色器程序到缓冲对象
// 4.1 绑定缓冲区对象
// gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); // 4.2 获取属性(定点的坐标点)
var coord = gl.getAttribLocation(shaderProgram, "coordinates"); // 4.3 将缓冲区对象分配给coord变量
// 这里是设置获取数据的规则 第二个参数3 表示每个点定点有3个数据(对应vec3)
gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0); // 4.4 启用属性
gl.enableVertexAttribArray(coord); //步骤五: 绘制所需的对象
// 清除画布颜色
gl.clearColor(0.5, 0.5, 0.5, 0.9); // 启用深度测试
gl.enable(gl.DEPTH_TEST); // 清除颜色缓冲位
gl.clear(gl.COLOR_BUFFER_BIT); // 设置视图窗口
gl.viewport(0,0,myCanvas.width,myCanvas.height); // 画 三角形
gl.drawArrays(gl.POINTS, 0, 3) } </script> </html>

WebGl 利用缓冲区对象画多个点的更多相关文章

  1. WebGl 利用drawArrays、drawElements画三角形

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  3. OpenGL顶点缓冲区对象(VBO)

    转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO        GL_ARB_vertex_buffer_object 扩展可 ...

  4. [译]OpenGL像素缓冲区对象

    目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_p ...

  5. WebGl 多缓冲区传递颜色和坐标(矩形)

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. WebGl 一个缓冲区传递颜色和坐标(矩形)

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  8. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  9. 利用navigator对象在浏览器中检查插件

    利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...

随机推荐

  1. Mongodb实战使用指南

    REL_LINK: http://www.mongodb.org.cn/tutorial/9.html   一 启动 启动 mongodb 服务(Mac) $ mongod --config /usr ...

  2. ViewDragHelper详解(侧滑栏)

    1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...

  3. Intent和BroadcastReceiver

    Intent简介 Intent是一种消息传递机制,作用: 使用类名显示启动一个特定的Service或Activity 启动Activity或Service来执行一个Intent 广播某个事件已经发生 ...

  4. 京东原来你运用的这玩意,不错,我也要!! ContainerDNS

    转自社区 ContainerDNS 本文介绍的 DNS 命名为 ContainerDNS,作为京东商城软件定义数据中心的关键基础服务之一,具有以下特点: 分布式,高可用 自动发现服务域名 后端探活 易 ...

  5. angular based app开发流程

    整理user story mock UI,生成满足上述user story的原型界面 根据上述UI,整理出data model(适用于后端和angular的数据模型) 后端CRUD开发,形成REST ...

  6. LeetCode5 最长回文子串

    最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...

  7. 深入探索C++对象模型(1) 关于对象(思维导图)

    通过上面整个关于对象的基础知识框架,我们来分析两个例子,看一下在内存中,对象究竟长什么样.   Demo1:C++对象模型的内存布局 class Point { public: Point( floa ...

  8. Django路由系统---django重点之url命名分组

    django重点之url命名分组[参数无顺序要求]. settigs.py:增加STATICFILES_DIRS静态资源路径配置,名称为创建的文件夹名称 'DIRS': [os.path.join(B ...

  9. 理解活在Iphone中的那些App (三)

    App的生存环境之宏观环境 从用户需求变成一个产品形体的App,是一个曲折的过程.主要的过程大概如此,分析用户需求,从用户需求中提炼出比较重要的部分,然后结合自己的创意,将其转化成产品.投放市场,接受 ...

  10. 高性能 Socket 组件 HP-Socket v3.2.1-RC3 公布

    HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包括服务端组件.client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统.提供 C/C+ ...