经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » WebGL » 查看文章
WebGl 利用缓冲区对象画多个点
来源:cnblogs  作者:&执念  时间:2019/4/1 9:06:42  对本文有异议

效果:

代码:

 

  1. 1 <!DOCTYPE html>
  2. 2 <html lang="en">
  3. 3 <head>
  4. 4 <meta charset="UTF-8">
  5. 5 <title>WebGl 利用缓冲区对象画多个点</title>
  6. 6 </head>
  7. 7 <body>
  8. 8
  9. 9 <canvas id="myCanvas" width="500" height="300" style='border:1px solid red'></canvas>
  10. 10
  11. 11 </body>
  12. 12
  13. 13
  14. 14 <script>
  15. 15
  16. 16 window.onload = function () {
  17. 17
  18. 18 //步骤一: 获取上下文
  19. 19 var myCanvas = document.getElementById('myCanvas');
  20. 20 var gl = myCanvas.getContext('webgl');
  21. 21
  22. 22
  23. 23
  24. 24 //步骤二: 定义三个点 ,并将其储存在缓存区对象
  25. 25 var vertices = [
  26. 26 -0.5,0.5,0.0,
  27. 27 0.0,0.5,0.0,
  28. 28 -0.25,0.25,0.0,
  29. 29 ];
  30. 30
  31. 31 // 2.1 创建一个空的缓冲区对象来存储顶点缓冲区
  32. 32 var vertex_buffer = gl.createBuffer();
  33. 33
  34. 34 // 2.2 绑定缓冲区对象
  35. 35 gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
  36. 36
  37. 37 // 2.3 将顶点数据传递到缓冲区
  38. 38 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
  39. 39
  40. 40
  41. 41
  42. 42 //步骤三: 创建和编译着色器程序
  43. 43 //定点着色器
  44. 44 var vertCode = "attribute vec3 coordinates;" +
  45. 45 "void main() {" +
  46. 46 "gl_Position = vec4(coordinates,1.0);" + //位置
  47. 47 "gl_PointSize = 10.0;" + //点的大小(单位像素)
  48. 48 "}";
  49. 49
  50. 50 //片段着色器
  51. 51 var fragCode = "void main() {" +
  52. 52 "gl_FragColor = vec4(1, 0.5, 0.0, 1);" + //RBGA值
  53. 53 "}";
  54. 54
  55. 55 // 3.1 创建一个顶点着色器对象、一个片段着色器对象
  56. 56 var vertShader = gl.createShader(gl.VERTEX_SHADER);
  57. 57 var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
  58. 58
  59. 59 // 3.2 为两个着色器附加源代码
  60. 60 gl.shaderSource(vertShader, vertCode);
  61. 61 gl.shaderSource(fragShader, fragCode);
  62. 62
  63. 63 // 3.3 编译着色器
  64. 64 gl.compileShader(vertShader);
  65. 65 gl.compileShader(fragShader);
  66. 66
  67. 67 // 3.4 创建要存储的着色器程序对象
  68. 68 var shaderProgram = gl.createProgram();
  69. 69
  70. 70 // 3.5 为着色器程序附加着色器
  71. 71 gl.attachShader(shaderProgram, vertShader);
  72. 72 gl.attachShader(shaderProgram, fragShader);
  73. 73
  74. 74 // 3.6 链接两个着色器
  75. 75 gl.linkProgram(shaderProgram);
  76. 76
  77. 77 // 3.7 使用组合着色器程序对象
  78. 78 gl.useProgram(shaderProgram);
  79. 79
  80. 80
  81. 81
  82. 82 //步骤四: 关联着色器程序到缓冲对象
  83. 83 // 4.1 绑定缓冲区对象
  84. 84 // gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
  85. 85
  86. 86 // 4.2 获取属性(定点的坐标点)
  87. 87 var coord = gl.getAttribLocation(shaderProgram, "coordinates");
  88. 88
  89. 89 // 4.3 将缓冲区对象分配给coord变量
  90. 90 // 这里是设置获取数据的规则 第二个参数3 表示每个点定点有3个数据(对应vec3)
  91. 91 gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
  92. 92
  93. 93 // 4.4 启用属性
  94. 94 gl.enableVertexAttribArray(coord);
  95. 95
  96. 96
  97. 97 //步骤五: 绘制所需的对象
  98. 98 // 清除画布颜色
  99. 99 gl.clearColor(0.5, 0.5, 0.5, 0.9);
  100. 100
  101. 101 // 启用深度测试
  102. 102 gl.enable(gl.DEPTH_TEST);
  103. 103
  104. 104 // 清除颜色缓冲位
  105. 105 gl.clear(gl.COLOR_BUFFER_BIT);
  106. 106
  107. 107 // 设置视图窗口
  108. 108 gl.viewport(0,0,myCanvas.width,myCanvas.height);
  109. 109
  110. 110 // 画 三角形
  111. 111 gl.drawArrays(gl.POINTS, 0, 3)
  112. 112
  113. 113
  114. 114 }
  115. 115
  116. 116 </script>
  117. 117
  118. 118 </html>

 

原文链接:http://www.cnblogs.com/zhinian-/p/10606901.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号