<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      webgl學習03-動態繪制點

      動態繪制點

      動態傳遞頂點坐標

      繪制動態點需要進行 JavaScript 和 GLSL 之間的信息交互,即將JS代碼中指定的點位傳入GLSL中進行繪制。

      常規頂點著色器代碼如下,我們需要通過JS代碼給 gl_Position 傳值來動態的繪制點位。

      const VertexSource = `
        void main () {
          // 頂點坐標
          gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
          // 頂點渲染像素大小
          gl_PointSize = 25.0;
        }
      `

      此時就需要引入GLSL中的變量 attribute 。

      attribute變量

      GLSL 中有三種類型的變量,而 attribute 就是其中之一。詳細介紹如下表:

      這些變量我們都可以在 JavaScript 中獲取到他們引用地址,并對他們設置值。

      代碼如下:

      通常命名方式為 類型前綴+變量名。比如說我們的一個 attribute 變量,我們以 a_Xxx 的方式來命名,如下 a_Dnamic

      const VertexSource = `
        // 定義了一個名為 a_dnamic,類型為 vec4 的 attribute 變量
        attribute vec4 a_Dnamic;
      
        void main () {
          // 將變量賦值給頂點坐標
          gl_Position = a_Dnamic;
          // 頂點渲染像素大小
          gl_PointSize = 25.0;
        }
      `

      接下來,我們只需在 JavaScript 中獲取這個變量 a_Dnamic再賦值就能實現動態傳遞頂點坐標了。

      其中 gl.getAttribLocation表示根據變量名獲取 program 中的 attribute 變量。

      gl.vertexAttrib[1234]f[v]表示根據獲取到的 attribute 變量進行賦值。其中1234為接受的浮點數數量,未接受為默認值0.0或1.0;v為允許接受數組。

      繪制動態點完整代碼

      const VertexSource = /* glsl */ `
          attribute vec4 a_dnamic_posi;
          void main() {
              gl_Position = a_dnamic_posi;
              gl_PointSize = 25.0;
          }
      `;
      
      const FragSource = /* glsl */ `
          void main() {
              gl_FragColor = vec4(0.0, 0.0, 0.9, 1.0);
          }
      `;
      
      const canvas = document.querySelector("#c");
      const gl = canvas.getContext("webgl");
      
      // 設置 canvas 背景色(若無需變化顏色,則只需要設置一次即可)
      gl.clearColor(0.0, 0.0, 0.0, 1.0);
      // 清空 canvas
      gl.clear(gl.COLOR_BUFFER_BIT);
      
      const vertexShader = gl.createShader(gl.VERTEX_SHADER);
      gl.shaderSource(vertexShader, VertexSource);
      gl.compileShader(vertexShader);
      
      const fragShader = gl.createShader(gl.FRAGMENT_SHADER);
      gl.shaderSource(fragShader, FragSource);
      gl.compileShader(fragShader);
      
      const program = gl.createProgram();
      gl.attachShader(program, vertexShader);
      gl.attachShader(program, fragShader);
      
      gl.linkProgram(program);
      gl.useProgram(program);
      
      let a_dnamicPosi = gl.getAttribLocation(program, "a_dnamic_posi");
      let points = [];
      canvas.onmousedown = function (e) {
          let x = e.offsetX;
          let y = e.offsetY;
          let rect = e.target.getBoundingClientRect();
          x = (x - rect.left - canvas.width / 2) / (canvas.width / 2);
          y = (canvas.height / 2 - (y - rect.top)) / (canvas.height / 2);
          points.push([x, y]);
          gl.clear(gl.COLOR_BUFFER_BIT);
          points.forEach((v)=>{
              // 必須通過記錄的點位來渲染是因為webgl使用的是顏色緩沖區
              // GPU是將畫面顏色記錄在緩沖區沖,一次性繪制在屏幕上的,每次都會清空屏幕
              gl.vertexAttrib3f(a_dnamicPosi, ...v, 0.0);
              gl.drawArrays(gl.POINTS, 0, 1);
          })
      };

       

      posted @ 2024-01-30 09:53  邢韜  閱讀(79)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久热这里只有精品12| 四虎永久精品免费视频| 无码福利一区二区三区| 久久99精品久久久久久| 91老熟女老人国产老太| 中文字幕一区日韩精品| 亚洲色大成网站WWW永久麻豆| 亚洲欧美不卡视频在线播放| 国产精品久久中文字幕| 9999国产精品欧美久久久久久| 欧美激烈精交gif动态图| 粉嫩一区二区三区精品视频| 精品一区二区三区四区五区 | 亚洲精品国产综合久久一线| 男人添女人下部高潮视频| 大安市| 国产欧美日韩视频一区二区三区| 白嫩少妇无套内谢视频| 爆乳2把你榨干哦ova在线观看| 高清国产av一区二区三区| 亚洲精品国产精品国在线| 男女18禁啪啪无遮挡激烈网站| 欧美成人黄在线观看| 资源新版在线天堂偷自拍| 国产AV无码专区亚洲AV漫画| 极品无码国模国产在线观看 | 国产一区二区精品偷系列| 国产精品亚洲二区亚瑟| 成年男女免费视频网站| 国产成人免费ā片在线观看| 亚洲国产精品午夜福利| 欧美最猛性xxxxx大叫| 亚洲男人第一无码av网站| 最新中文乱码字字幕在线| 中国china体内裑精亚洲日本| 亚洲av成人一区二区三区| 粗大猛烈进出高潮视频| 亚洲av成人无码精品电影在线| 在线看av一区二区三区| 亚洲日韩欧美丝袜另类自拍| 在线a亚洲老鸭窝天堂|