WebGl 利用drawArrays、drawElements畫三角形

来源:https://www.cnblogs.com/zhinian-/archive/2019/03/31/10631438.html
-Advertisement-
Play Games

效果: 代碼: ...


效果:

 

代碼:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebGl  利用drawArrays、drawElements畫三角形</title>
</head>
<body>

<canvas id="myCanvas" width="500" height="300" style="border: 1px solid red"></canvas>

</body>
<script>

    window.onload = function () {

        //第1步 - 準備Canvas和獲取WebGL的渲染上下文
        var canvas = document.getElementById('myCanvas'),
            gl = canvas.getContext('webgl');

        //第2步 - 定義幾何並將其存儲在緩衝區對象
        var vertices = [
            -0.5,0.5,0.0,
            0.0,0.5,0.0,
            -0.25,0.25,0.0,
            0.5,0.5,0.0,
            0.25,0.25,0.0,
        ],
        indices =[0,1,2,1,3,4];

        var vertex_buffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
        gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);

        var Index_Buffer = gl.createBuffer();
        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);

        //第3步 - 創建和編譯著色器程式
        var vertCode =
            'attribute vec3 coordinates;' +
            'void main(void) {' +
            ' gl_Position = vec4(coordinates, 1.0);' +
            '}';

        var fragCode = 'void main(void) {' +
            ' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +
            '}';

        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(vertShader,vertCode);
        gl.shaderSource(fragShader,fragCode);
        gl.compileShader(vertShader);
        gl.compileShader(fragShader);
        var shaderProgram = gl.createProgram();
        gl.attachShader(shaderProgram,vertShader);
        gl.attachShader(shaderProgram,fragShader);
        gl.linkProgram(shaderProgram);
        gl.useProgram(shaderProgram);


        //第4步 - 關聯著色器程式到緩衝區對象
        var coord = gl.getAttribLocation(shaderProgram,'coordinates');
        gl.vertexAttribPointer(coord,3,gl.FLOAT,false,0,0);
        gl.enableVertexAttribArray(coord);

        //第5步 - 繪製所需的對象
        gl.clearColor(0.5, 0.5, 0.5, 0.9);
        gl.enable(gl.DEPTH_TEST);
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.viewport(0,0,myCanvas.width,myCanvas.height);

        //gl.drawArrays(gl.TRIANGLES, 0, 3)//畫簡單的三角形  此方法不需要索引
        //gl.drawArrays(gl.TRIANGLES, 0, 6)//如果下需要畫兩個三角形 那麼vertices數組中需要增加一個點

        gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);//利用drawElements畫三角形
        //畫矩形 更改indices即可


        //繪圖模式如下:
        //gl.POINTS:要繪製一系列的點
        //gl.LINES:要繪製了一系列未連接直線段(單獨行)
        //gl.LINE_STRIP:要繪製一系列連接的線段
        //gl.LINE_LOOP:要繪製一系列連接的線段。它還連接的第一和最後的頂點,以形成一個環
        //TRIANGLES:一系列單獨的三角形;繪製方式:(v0,v1,v2),(v1,v3,v4)
        //TRIANGLE_STRIP:一系列帶狀的三角形
        //TRIANGLE_FAN:扇形繪製方式
    }

</script>
</html>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...