WebGl 一个缓冲区传递颜色和坐标(矩形)
效果:

代码:
<!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 canvas = document.getElementById('myCanvas');
var gl = canvas.getContext('webgl'); //定义矩形数据 并 将其储存在缓存对象
var vertices = [
-0.5,0.5,0.0, 0.0,0.0,1.0,//(x,y,z)(r,g,b)分别代表坐标和颜色
-0.5,-0.5,0.0, 1.0,0.0,0.0,
0.5,-0.5,0.0, 0.0,1.0,0.0,
0.5,0.5,0.0, 1.0,0.0,1.0,
]; var indices = [3,2,1,3,1,0]; var vertex_buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); var Index_Buffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Index_Buffer);//注意 是 ELEMENT_ARRAY_BUFFER 不是 ARRAY_BUFFER
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
//bufferData 参数详解
//数据类型,可以是 gl.ARRAY_BUFFER , gl.ELEMENT_ARRAY_BUFFER
//数据
//缓冲类型,有这么几种可以供我们选择 GL_STREAM_DRAW , GL_STATIC_DRAW ,GL_DYNAMIC_DRAW
//缓冲区的数据偶尔变动用GL_STREAM_DRAW ,缓冲区的数据不变用GL_STATIC_DRAW,缓冲区数据经常变动用GL_DYNAMIC_DRAW //创建和编译着色器程序
var vertCode = 'attribute vec3 coordinates;'+
'attribute vec3 color;'+
'varying vec3 vColor;'+ 'void main(void) {' +
' gl_Position = vec4(coordinates, 1.0);' +
'vColor = color;'+
'}';
var fragCode = 'precision mediump float;'+
'varying vec3 vColor;'+
'void main(void) {'+
'gl_FragColor = vec4(vColor, 1.0);'+
'}'; var vertShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertShader, vertCode);
gl.compileShader(vertShader); var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragShader, fragCode);
gl.compileShader(fragShader); var shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertShader);
gl.attachShader(shaderProgram, fragShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram); //与缓冲区对象相关联着色器程序 // vertices中每个元素的字节数 ,这里是 float 类型, 所以是 4 个字节
var bytes = new Float32Array(vertices).BYTES_PER_ELEMENT; var coord = gl.getAttribLocation(shaderProgram, "coordinates");
gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, bytes*6, 0);
gl.enableVertexAttribArray(coord); var color = gl.getAttribLocation(shaderProgram, "color");
gl.vertexAttribPointer(color, 3, gl.FLOAT, false, bytes*6, bytes*3) ;
gl.enableVertexAttribArray(color); //绘制所需的对象
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,canvas.width,canvas.height);
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0); } // vertexAttribPointer(location, int size, enum type, bool normalized, long stride, long offset) 参数详解
//Location − 它指定一个属性变量的存储位置。根据这个方案,必须通过由getAttribLocation()方法返回的值
//Size − 它指定在缓冲对象每顶点部件的数量
//Type − 它指定数据的类型
//Normalized − 这是一个布尔值。如果为真,非浮动数据被归一化到[0,1]。否则,它被归一化到[-1,1]
//Stride − 它指定不同顶点数据元素之间的字节数,或默认为零步幅(字节)
//Offset − 它指定在缓冲器对象,以指示数据从顶点的哪个存储字节偏移(字节) </script> </html>
WebGl 一个缓冲区传递颜色和坐标(矩形)的更多相关文章
- WebGl 多缓冲区传递颜色和坐标(矩形)
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- WebGl 利用缓冲区对象画多个点
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 推荐一个iOS关于颜色的库-Wonderful
Wonderful 这个库主要是与UIColor息息相连的,其中一共包含四个子文件,UIColor+Wonderful,UIColor+Separate,SXColorGradientView,SXM ...
- Intent(三)向下一个活动传递数据
向下传递活动很简单,可以我采用putExtra()方法的重载,把我们想要传递的数据暂时放在intent中,启动活动时从这里取就可以了. 首先我们在MainActivity(主活动)显式声明intent ...
- 如何在linux Shell脚本里面把一个数组传递到awk内部进行处理
前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分 ...
- Intent 隐式跳转,向下一个活动传递数据,向上一个活动返回数据。
一.每个Intent只能指定一个action,多个Category. 使用隐式跳转,我们不仅可以跳转到自己程序内的活动,还可以启动其他程序的活动.使得Android多个程序之间的功能共享成为可能. 例 ...
- Android开发:向下一个activity传递数据,返回数据给上一个activity
1.向下一个activity传递数据 activity1 Button button=(Button) findViewById(R.id.button1); button.setOnClickLis ...
- WPF 一个简单的颜色选择器
原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...
- Android基础Activity篇——Intent向下一个活动传递数据
1.向下一个活动传递数据 String data ="bilibilbilbilbili"; Intent intent1=new Intent(this,secondActivi ...
随机推荐
- Android适配--百分比的适配
首先,需要添加com.android.support:percent:24.1.1 包,版本随意. dependencies { compile fileTree(dir: 'libs', inclu ...
- PHP计算近1年的所有月份
$z = date('Y-m'); $a = date('Y-m', strtotime('-12 months')); $begin = new DateTime($a); $end = new D ...
- DDD(领域驱动设计)总结
基本概念: 领域驱动设计(简称 ddd)概念来源于2004年著名建模专家eric evans发表的他最具影响力的书籍:<domain-driven design –tackling comple ...
- ASP.NET 控件不可编辑
前台页面的解析后的html代码为disabled="disabled",而在后台我们需要设置控件的Enabled=false:即可.
- 使用信号进行同步 sem_post
使用信号进行同步 信号是 E. W. Dijkstra 在二十世纪六十年代末设计的一种编程架构.Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过. 信号将用于同 ...
- Source InSight context 窗口丢失的解决办法
我没关si的情况下强制关机导致的 Source InSight context 窗口丢失的解决办法 (2010-09-03 13:35:45) 转载▼ 今天早晨改改CLI,上了趟WC,回来发现 ...
- C++课堂作业二之反转链表
1问题链接: https://www.patest.cn/contests/pat-b-practise/1025 2解题想法: 这题原来用数组打过,现在是想保留暂存数据的数组,然后按顺序提取出来到创 ...
- 学习EChart.js(四) 移动端显示
ECharts.js 移动端显示 现在很多时候,我们是在用手机.pad等一些移动端设备来进行办公获取数据.所以我们的图表很多时候是需要用移动端设置来查看的,而我们的图表有时候因为数据的偏多,会出现遮挡 ...
- scala当中的类型参数
类型参数主要就是研究scala当中的类或者scala当中的方法的泛型 1.scala当中的类的泛型 object Demo8 { def main(args: Arr ...
- scala基础入门
1.scala当中申明值和变量 scala当中的变量申明可以使用两种方式,第一种使用val来申明变量.第二种使用var来申明变量. 申明变量语法 val/var 变量名 [:变量类型] = 变量值 其 ...