• webGL编程指南 第三章 绘制四角形.helloQuadjs


    我会持续更新关于wegl的编程指南中的代码。

    当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助

    git代码地址

    接着  上一节 接着做使用缓冲区赋值。

    本节中我们还是使用4个顶点,放在一个数组中。然后去获取缓冲区中的数据,同时绘制正方形

    下面是代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. head>
    9. <body>
    10. <canvas id='canvas'>canvas>
    11. <script>
    12. let canvas = document.getElementById('canvas');
    13. let gl = canvas.getContext('webgl');
    14. let vertexShaderSource = `
    15. attribute vec2 a_Position;//顶点的位置变量
    16. void main(){
    17. gl_Position = vec4(a_Position,0.0,1.0) ;
    18. }
    19. `
    20. let fragmentShaderSouce = `
    21. precision mediump float;
    22. void main(){
    23. //设置片元的颜色
    24. gl_FragColor = vec4(0.223,0.378,0.790,1.0);
    25. }
    26. `
    27. //创建顶点着色器
    28. let vertexShader = gl.createShader(gl.VERTEX_SHADER);
    29. //绑定顶点着色器
    30. gl.shaderSource(vertexShader, vertexShaderSource);
    31. //编译顶点着色器
    32. gl.compileShader(vertexShader)
    33. //创建片元着色器
    34. let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    35. //绑定片元着色器
    36. gl.shaderSource(fragmentShader, fragmentShaderSouce)
    37. //编译片元着色器
    38. gl.compileShader(fragmentShader)
    39. //创建渲染程序
    40. let program = gl.createProgram();
    41. //绑定渲染程序
    42. gl.attachShader(program, vertexShader);
    43. gl.attachShader(program, fragmentShader);
    44. //链接渲染程序
    45. gl.linkProgram(program);
    46. //使用当前渲染程序
    47. gl.useProgram(program);
    48. //检测赋值是否有报错
    49. if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
    50. throw gl.getProgramInfoLog(program);
    51. }
    52. //设置顶点位置
    53. let positonArray = new Float32Array([
    54. -0.5,0.5,
    55. -0.5,-0.5,
    56. 0.5,0.5,
    57. 0.5,-0.5,
    58. ])
    59. //获取顶点位置的a_Position变量
    60. let a_Position = gl.getAttribLocation(program, 'a_Position');
    61. //开始往a_Position中传递数据
    62. //创建缓冲区
    63. let buffer = gl.createBuffer();
    64. //绑定缓冲区
    65. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    66. //将数据存入缓冲区
    67. gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW);
    68. //将缓冲区中的数据存入a_Position中
    69. //buffer中已经存在数据了,现在将数据分配至给指定的变量
    70. // |将buffer中的数据分配给a_Position
    71. // |(因为我们设置的vec2并且positonArray中的变量一共6个)
    72. // |(传入的是float值得类型)
    73. // |不进行归一化操作
    74. // |变量需要的数据是2个字符为一套
    75. // |每一套数据中数据偏移为0
    76. //vertexAttribPointer : https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/vertexAttribPointer
    77. gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 2*4, 0);
    78. //开启a_Position
    79. gl.enableVertexAttribArray(a_Position);
    80. //绘制
    81. //设置清屏时候的颜色
    82. gl.clearColor(0.0, 0.0, 0.0, 1.0);
    83. //清空颜色缓冲区
    84. gl.clear(gl.COLOR_BUFFER_BIT);
    85. //绘制图形
    86. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
    87. script>
    88. body>
    89. html>

  • 相关阅读:
    简单解决网页的验证码
    【最佳实践】京东小程序-LBS业务场景的性能提升
    Audio Hijack for Mac 激活版:音频录制与处理软件
    IDEA
    面试:单例模式
    SpringMVC
    【计算机网络】https协议
    并发——中断机制
    JSON Web Token
    MySQL数据类型的选择(详解版)
  • 原文地址:https://blog.csdn.net/huhudeni/article/details/133774550