• 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 vec3 a_Position;
    16. attribute vec3 a_Color;
    17. varying vec3 v_Color;
    18. void main(){
    19. gl_Position = vec4(a_Position,1.0);
    20. v_Color = a_Color;
    21. }
    22. `
    23. let fragmentShaderSouce = `
    24. precision mediump float;
    25. varying vec3 v_Color;
    26. void main(){
    27. gl_FragColor =vec4(v_Color,1.0) ;
    28. }
    29. `
    30. // 创建顶点着色器
    31. let vertexShader = gl.createShader(gl.VERTEX_SHADER);
    32. // 绑定着色器源码
    33. gl.shaderSource(vertexShader, vertexShaderSource)
    34. // 编译着色器
    35. gl.compileShader(vertexShader)
    36. // 创建片段着色器
    37. let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    38. // 绑定着色器源码
    39. gl.shaderSource(fragmentShader, fragmentShaderSouce);
    40. // 编译着色器
    41. gl.compileShader(fragmentShader);
    42. //创建渲染程序
    43. let program = gl.createProgram();
    44. // 绑定渲染程序
    45. gl.attachShader(program, vertexShader);
    46. // 绑定渲染程序
    47. gl.attachShader(program, fragmentShader);
    48. // 链接渲染程序
    49. gl.linkProgram(program);
    50. //使用当前渲染程序
    51. gl.useProgram(program)
    52. //检测赋值是否有报错
    53. if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
    54. throw gl.getProgramInfoLog(program);
    55. }
    56. // 设置顶点位置
    57. let positonArray = new Float32Array([
    58. -0.5, 0.5, 0,
    59. -0.5, -0.5, 0,
    60. 0.5, 0.5, 0,
    61. 0.5, -0.5, 0,
    62. ])
    63. //随机颜色数据
    64. let colorList = new Float32Array(12)
    65. for (let index = 0; index < 12; index++) {
    66. colorList[index] = Math.random()
    67. }
    68. //获取顶点变量
    69. let a_Position = gl.getAttribLocation(program, 'a_Position');
    70. // 获取颜色变量
    71. let a_Color = gl.getAttribLocation(program, 'a_Color')
    72. // 绑定颜色数据
    73. let buffer = gl.createBuffer();
    74. //绑定缓冲区
    75. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    76. // 向缓冲区写入数据
    77. gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW)
    78. // 设置顶点数据
    79. //buffer中已经存在数据了,现在将数据分配至给指定的变量
    80. // |将buffer中的数据分配给a_Position
    81. // |(因为我们设置的vec3并且positonArray中的变量一共12个)
    82. // |(传入的是float值得类型)
    83. // |不进行归一化操作
    84. // |变量需要的数据是3个字符为一套
    85. // |每一套数据中数据偏移为0
    86. //vertexAttribPointer : https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/vertexAttribPointer
    87. //赋值给a_Position的变量
    88. //一组需要3个字符(x,y,z)
    89. //传入的是float值得类型
    90. //不需要归一化
    91. //变量需要的数据是3个字符为一套 一个字符占4个字节
    92. //每一套数据中数据偏移为0
    93. gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, 3 * positonArray.BYTES_PER_ELEMENT, 0);
    94. // 启用顶点数据
    95. gl.enableVertexAttribArray(a_Position);
    96. // 绑定颜色数据
    97. let colorBuffer = gl.createBuffer()
    98. //绑定缓冲区
    99. gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer)
    100. // 向缓冲区写入数据
    101. gl.bufferData(gl.ARRAY_BUFFER, colorList, gl.STATIC_DRAW);
    102. //同上述的解是
    103. //赋值给a_Color变量
    104. //一个a_Color需要3个
    105. //传入的是float值得类型
    106. //不需要归一化
    107. //变量需要的数据是3个字符为一套 一个字符占4个字节
    108. //每一套数据中数据偏移为0
    109. gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, 3 * colorList.BYTES_PER_ELEMENT, 0);
    110. // 启用顶点数据
    111. gl.enableVertexAttribArray(a_Color);
    112. //绘制
    113. gl.clearColor(0.0, 0.0, 0.0, 1.0);
    114. //清空颜色缓冲区
    115. gl.clear(gl.COLOR_BUFFER_BIT);
    116. //绘制图形
    117. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
    118. console.log(positonArray)
    119. script>
    120. body>
    121. html>

  • 相关阅读:
    burp || Note: Disk-based projects are onlysupported on Burp Suite Professional
    关于Skywalking Agent customize-enhance-trace对应用复杂参数类型取值
    推荐一款功能强大的 GPT 学术优化开源项目GPT Academic:学术研究的智能助手
    CDN工作原理
    【牛客-剑指offer-数据结构篇】JZ52 两个链表的第一个公共节点 两种思路 Java实现
    哪些企业需要数字化转型?
    无线设备天线的选型及其安装注意事项
    深度学习落地实战:基于UNet实现血管瘤超声图像分割
    javabasic
    go-micro集成链路跟踪的方法和中间件原理
  • 原文地址:https://blog.csdn.net/huhudeni/article/details/133774629