webgl学习笔记二-绘图多点
来源:互联网 发布:mac局域网通信软件 编辑:程序博客网 时间:2024/06/06 01:48
写在前面
建议先看下第一篇webgl学习笔记一-绘图单点
第一篇文章,介绍了如何用webgl绘图一个点。接下来本文介绍的是如何绘制多个点。形成一个面。
webgl提供了一种很方便的机制,即缓冲区对象,可以一次性地向着色器传入多个顶点的数据。缓存区对象是webgl系统的一块内存区域。
绘制多个点的流程
这里重点介绍缓冲区对象使用步骤
- 创建缓冲区对象
gl.createBuffer()
- 绑定缓冲区对象
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
- 将数据写入缓冲区对象
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
- 将缓冲区对象分配给一个attribute变量
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
开启attribute变量
gl.enableVertexAttribArray(a_Position);
demo
- 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 = "attribute vec4 a_Position;" + "void main() {" + //设置坐标 "gl_Position = a_Position; " + "} "; //片元着色器 var FSHADER_SOURCE = "void main() {" + //设置颜色 "gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" + "}"; //获取canvas元素 var canvas = document.getElementById('canvas'); //获取绘制二维上下文 var gl = canvas.getContext('webgl'); if (!gl) { console.log("Failed"); return; } //编译着色器 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); //合并程序 var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertShader); gl.attachShader(shaderProgram, fragShader); gl.linkProgram(shaderProgram); gl.useProgram(shaderProgram); //获取坐标点 var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position'); if (a_Position < 0) { console.log('Failed to get the storage location of a_Position'); return; } var n = initBuffers(gl, shaderProgram); if (n < 0) { console.log('Failed to set the positions'); return; } // 清除指定<画布>的颜色 gl.clearColor(0.0, 0.0, 0.0, 1.0); // 清空 <canvas> gl.clear(gl.COLOR_BUFFER_BIT); gl.drawArrays(gl.TRIANGLES, 0, n); } function initBuffers(gl, shaderProgram) { var vertices = new Float32Array([ 0.0, 0.5, -0.5, -0.5, 0.5, -0.5 ]); var n = 3;//点的个数 //创建缓冲区对象 var vertexBuffer = gl.createBuffer(); if (!vertexBuffer) { console.log("Failed to create the butter object"); return -1; } //将缓冲区对象绑定到目标 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); //向缓冲区写入数据 gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); //获取坐标点 var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position'); //将缓冲区对象分配给a_Position变量 gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0); //连接a_Position变量与分配给它的缓冲区对象 gl.enableVertexAttribArray(a_Position); return n; }</script>
阅读全文
0 0
- webgl学习笔记二-绘图多点
- webgl学习笔记二
- webgl学习笔记一-绘图单点
- WebGL学习笔记(二)
- WEBGL学习【七】画布绘图
- [WebGL入门]二十六,纹理绘图
- WebGL学习笔记1
- WebGL学习笔记3
- WebGL学习笔记
- WebGL学习笔记(1)
- webgl学习笔记一
- webgl学习笔记一
- 绘图及多点触摸学习一
- WebGL笔记_光(二)
- MFC学习笔记之简单绘图二
- MFC学习笔记之简单绘图二
- 绘图与动画学习笔记(二)
- R基础绘图学习笔记(二)
- Linux下openresty+redis 的权限控制
- SharedPreferences导航页 第二次直接跳转
- jpython的使用(Java调用python脚本)
- Android基础总结七:SeekBar的使用
- RQNOJ 311 乘积最大
- webgl学习笔记二-绘图多点
- 自定义圆形进度条
- Android用CMake进行JNI编程学习
- 我的C程序设计语言学习日记#05
- 数据结构与算法——2.1线性表的概念
- 数据库表的连接 join on
- LoadRunner问题处理
- 12种排序算法详解
- 看过Django后回头来看Flask(1)