效果:

代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebGl 利用drawArrays、drawElements画三角形</title>
</head>
<body> <canvas id="myCanvas" width="500" height="300" style="border: 1px solid red"></canvas> </body>
<script> window.onload = function () { //第1步 - 准备Canvas和获取WebGL的渲染上下文
var canvas = document.getElementById('myCanvas'),
gl = canvas.getContext('webgl'); //第2步 - 定义几何并将其存储在缓冲区对象
var vertices = [
-0.5,0.5,0.0,
0.0,0.5,0.0,
-0.25,0.25,0.0,
0.5,0.5,0.0,
0.25,0.25,0.0,
],
indices =[0,1,2,1,3,4]; 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);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); //第3步 - 创建和编译着色器程序
var vertCode =
'attribute vec3 coordinates;' +
'void main(void) {' +
' gl_Position = vec4(coordinates, 1.0);' +
'}'; var fragCode = 'void main(void) {' +
' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +
'}'; var vertShader = gl.createShader(gl.VERTEX_SHADER);
var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vertShader,vertCode);
gl.shaderSource(fragShader,fragCode);
gl.compileShader(vertShader);
gl.compileShader(fragShader);
var shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram,vertShader);
gl.attachShader(shaderProgram,fragShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram); //第4步 - 关联着色器程序到缓冲区对象
var coord = gl.getAttribLocation(shaderProgram,'coordinates');
gl.vertexAttribPointer(coord,3,gl.FLOAT,false,0,0);
gl.enableVertexAttribArray(coord); //第5步 - 绘制所需的对象
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.TRIANGLES, 0, 3)//画简单的三角形 此方法不需要索引
//gl.drawArrays(gl.TRIANGLES, 0, 6)//如果下需要画两个三角形 那么vertices数组中需要增加一个点 gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);//利用drawElements画三角形
//画矩形 更改indices即可 //绘图模式如下:
//gl.POINTS:要绘制一系列的点
//gl.LINES:要绘制了一系列未连接直线段(单独行)
//gl.LINE_STRIP:要绘制一系列连接的线段
//gl.LINE_LOOP:要绘制一系列连接的线段。它还连接的第一和最后的顶点,以形成一个环
//TRIANGLES:一系列单独的三角形;绘制方式:(v0,v1,v2),(v1,v3,v4)
//TRIANGLE_STRIP:一系列带状的三角形
//TRIANGLE_FAN:扇形绘制方式
} </script>
</html>

最新文章

  1. 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
  2. js 变量提升和函数提升原理
  3. ERROR ITMS-90032 “Invalid image path”
  4. Android--ListView显示列表数据
  5. 日志输出--C#
  6. HDU 2444 The Accomodation of Students(二分图判定+最大匹配)
  7. 阿里面试题,深入理解Java类加载机制
  8. mssql-sqlserver入门必备知识收集
  9. P2708 硬币翻转(简单模拟)
  10. camera理论基础和工作原理【转】
  11. Laravel开发采坑系列问题
  12. 修复bug及修复过程
  13. Redis笔记(3)多数据库实现
  14. [目前最火的前端开发框架]React组件的应用分析
  15. Springboot IDEA eclipse 打包
  16. Spring学习----- Spring配置文件xml文档的schema约束
  17. LeetCode - Employees Earning More Than Their Managers
  18. Wannafly挑战赛15-C-出队
  19. TestNG+Maven+IDEA 自动化测试(二) TestNG.xml
  20. ORACLE数据库导出导入数据

热门文章

  1. volley4--RequestQueue
  2. 关于App的cpu/内存/流量 /电量的方法(GT工具)
  3. Monte Carlo与TD算法
  4. Spring Cloud中,Eureka常见问题总结
  5. 使用 docker-machine 管理 Azure 容器虚拟机
  6. Windows Azure系列公开课 - 第二课:为什么选择Windows Azure(下)
  7. Linux(CentOS)网卡的基本设置
  8. Java学习---JDK的安装和配置
  9. 最优化 KKT条件
  10. 10G client连接数据库