经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » WebGL » 查看文章
WebGl 二维纹理贴图(矩形)
来源:cnblogs  作者:&执念  时间:2019/4/1 9:06:37  对本文有异议

效果:

 

代码:

 

  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 <script>
  14. 14
  15. 15 window.onload = function () {
  16. 16
  17. 17 //获取上下文
  18. 18 var canvas = document.getElementById('myCanvas');
  19. 19 var gl = canvas.getContext('webgl');
  20. 20
  21. 21 //定义矩形数据 并 将其储存在缓存对象
  22. 22 var vertices = [
  23. 23 -0.5,0.5,0.0, 0.0,0.0,//(x,y,z)(r,g,b)分别代表坐标和颜色
  24. 24 -0.5,-0.5,0.0, 1.0,0.0,
  25. 25 0.5,-0.5,0.0, 0.0,1.0,
  26. 26 0.5,0.5,0.0, 1.0,1.0,
  27. 27 ];
  28. 28
  29. 29 var indices = [3,2,1,3,1,0];
  30. 30
  31. 31 var vertex_buffer = gl.createBuffer();
  32. 32 gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
  33. 33 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
  34. 34
  35. 35 var Index_Buffer = gl.createBuffer();
  36. 36 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Index_Buffer);//注意 是 ELEMENT_ARRAY_BUFFER 不是 ARRAY_BUFFER
  37. 37 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
  38. 38
  39. 39 //创建和编译着色器程序
  40. 40 var vertCode = 'attribute vec3 coordinates;' +
  41. 41 'attribute vec2 texCoord;' +
  42. 42 'varying vec2 vtexCoord;' +
  43. 43 'void main() {' +
  44. 44 ' gl_Position = vec4(coordinates, 1.0);' +
  45. 45 ' vtexCoord = texCoord;' +
  46. 46 '}';
  47. 47 var fragCode = 'precision mediump float;' +
  48. 48 'varying vec2 vtexCoord;' +
  49. 49 'uniform sampler2D u_Sampler;' +
  50. 50 'void main() {' +
  51. 51 ' gl_FragColor = texture2D(u_Sampler, vtexCoord);' +
  52. 52 '}';
  53. 53
  54. 54 var vertShader = gl.createShader(gl.VERTEX_SHADER);
  55. 55 gl.shaderSource(vertShader, vertCode);
  56. 56 gl.compileShader(vertShader);
  57. 57
  58. 58 var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
  59. 59 gl.shaderSource(fragShader, fragCode);
  60. 60 gl.compileShader(fragShader);
  61. 61
  62. 62 var shaderProgram = gl.createProgram();
  63. 63 gl.attachShader(shaderProgram, vertShader);
  64. 64 gl.attachShader(shaderProgram, fragShader);
  65. 65 gl.linkProgram(shaderProgram);
  66. 66 gl.useProgram(shaderProgram);
  67. 67
  68. 68
  69. 69 //与缓冲区对象相关联着色器程序
  70. 70 var bytes = new Float32Array(vertices).BYTES_PER_ELEMENT;// vertices中每个元素的字节数 ,这里是 float 类型, 所以是 4 个字节
  71. 71
  72. 72 var coord = gl.getAttribLocation(shaderProgram, "coordinates");
  73. 73 gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, bytes*5, 0);
  74. 74 gl.enableVertexAttribArray(coord);
  75. 75
  76. 76 var texCoord = gl.getAttribLocation(shaderProgram, "texCoord");
  77. 77 gl.vertexAttribPointer(texCoord, 2, gl.FLOAT, false, bytes*5, bytes*3) ;
  78. 78 gl.enableVertexAttribArray(texCoord);
  79. 79
  80. 80
  81. 81 //创建纹理对象并调用纹理绘制方法
  82. 82 var texture = gl.createTexture();//创建纹理对象
  83. 83 var u_Sampler = gl.getUniformLocation(shaderProgram,"u_Sampler");//获取u_Sampler的存储位置
  84. 84 var image = new Image();//创建image对象
  85. 85 image.src = "./timg.jpg";
  86. 86 image.onload = function () {//加载纹理
  87. 87 //纹理绘制
  88. 88 gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);//对纹理图像进行y轴反转
  89. 89 gl.activeTexture(gl.TEXTURE0);//开启0号纹理单元
  90. 90 gl.bindTexture(gl.TEXTURE_2D,texture);//向target绑定纹理对象
  91. 91 gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);//配置纹理参数
  92. 92 gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);//配置纹理图像
  93. 93 gl.uniform1i(u_Sampler,0);//将0号纹理传递给着色器
  94. 94
  95. 95 //绘制
  96. 96 gl.clearColor(0.0,0.0,0.0,1.0);
  97. 97 gl.clear(gl.COLOR_BUFFER_BIT);
  98. 98 gl.drawElements(gl.TRIANGLE_STRIP, indices.length, gl.UNSIGNED_SHORT,0);
  99. 99
  100. 100 };
  101. 101
  102. 102
  103. 103 }
  104. 104
  105. 105 </script>
  106. 106
  107. 107 </html>

 

原文链接:http://www.cnblogs.com/zhinian-/p/10631497.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号