WebGL 入門-原生API介紹

2020-12-06 CSDN技術社區

要把WebGL繪製到頁面上,通常需要執行如下工作:

1.創建畫布元素

2.獲取呈現上下文

3.初始化視口

4.創建頂點數組

5.創建矩陣

6.加載著色器

7.繪製

創建畫布元素並獲取上下文

WebGL都發生在Canvas 元素的上下文中,Canvs的上下文是一個JavaScript對象,它提供了完整的WebGL API,你可以愛屏幕上創建和操作圖形。

由於WebGL 規範仍在開發中,因此上下文仍處於「實驗」階段。當前,大部分瀏覽器都使用語法 canvas.getContext("experimental-webgl") 來獲取 WebGLRenderingContext。

//從Canvas中獲取上下文

function initWebGL(canvas) {

    var gl;

    try {

        gl = canvas.getContext("experimental-webgl") || canvas.getContext("webgl");

    } catch (e) {

        //Fail quietly

    }

    return gl;

}

初始化視口

獲得Canvas的上下文後,我們就可以設置在哪塊區域繪製WebGL了。在WebGL中,這被稱為視口(viewport)。

//將WebGL的視口設置為整個畫布的大小

function initViewport(gl, canvas) {

    gl.viewport(0, 0, canvas.width, canvas.height);

}

創建頂點數組

WebGL的繪製由圖元(primitive)組成。圖元的數據數組稱為Buffer,它定義了頂點的位置。

下面的代碼展示了如何創建一個大小為1x1的正方形的頂點數據。返回的JavaSript對象存儲了頂點數據信息、數組中每個頂點所佔的尺寸(在這個實例中包含三個浮點數來存儲x、y、z的值)、需要繪製的頂點的數據,以及用於繪製正方形的圖元的類型。

頂點數組是 Float32Array 類型的類型化數組。 這是一種為了WebGL專門引入的新數據類型。它相比傳統數組速度更快並且佔用更少的內存。

//創建用於繪製正方形的定點數據

function createSquare(gl) {

    var vertexBuffer;

        vertexBuffer = gl.createBuffer();

    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

    var verts = [

         .5,  .5,  0.0,

        -.5,  .5,  0.0,

         .5, -.5,  0.0,

        -.5, -.5,  0.0

    ];

    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW);

    var square = {buffer:vertexBuffer, vertSize:3, nVerts:4, primtype:gl.TRIANGLE_STRIP};

    return square;

}

創建矩陣

在繪製正方形之前,我們需要先建立兩個矩陣。首先我們需要一個矩陣來定義正方形在3D坐標系中相對於攝像機的位置,這個矩陣也被稱為模型視圖矩陣(modelview matrix)。

第二個矩陣是投影矩陣(projection matrix),這個矩陣將被用於在著色器中將攝像機空間中的模型的3D坐標轉換為繪製的視口的2D坐標。

function initMatrices(){

       // 正方形的變換矩陣——相對與相機沿著z軸稍微後移一些

       modelViewMatrix = new Float32Array(

               [1, 0, 0, 0,

                0, 1, 0, 0, 

                0, 0, 1, 0, 

                0, 0, -3.333, 1]);

       

       // 變換矩陣*45度視野(

       projectionMatrix = new Float32Array(

               [2.41421, 0, 0, 0,

                0, 2.41421, 0, 0,

                0, 0, -1.002002, -1, 

                0, 0, -0.2002002, 0]);

}

著色器

著色器由兩部分組成:頂點著色器(vertex shader)和片元著色器(fragment shader)。頂點著色器負責將模型的坐標轉換帶2D視口,片元著色器負責將元素輸出到轉換後的頂點像素。

因為篇幅有限,我們在這裡只展示部分代碼:

var vertexShaderSource =

        "    attribute vec3 vertexPos;\n" +

        "    uniform mat4 modelViewMatrix;\n" +

        "    uniform mat4 projectionMatrix;\n" +

        "    void main(void) {\n" +

        "        // 返回變換並投影后的頂點數據\n" +

        "        gl_Position = projectionMatrix * modelViewMatrix * \n" +

        "            vec4(vertexPos, 1.0);\n" +

        "    }\n";

var fragmentShaderSource = 

        "    void main(void) {\n" +

        "    // 返回像素顏色,永遠輸出白色\n" +

       "    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" +

 "}\n";

繪製圖元

現在我們開始真正繪製正方形。首先清理畫布並設置黑色為背景色。然後將頂點數組綁定到上下文中,使用著色器,並把定點數組和矩陣作為輸入傳遞給著色器。最後調用WebGL的drawArrays() 方法來繪製正方形。

 function draw(gl, obj) {

     // 用黑色清空背景

     gl.clearColor(0.0, 0.0, 0.0, 1.0);

     gl.clear(gl.COLOR_BUFFER_BIT);

     // 設置頂點數組

     gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer);

     // 設置著色器

     gl.useProgram(shaderProgram);

     // 設置著色器參數:頂點坐標、投影矩陣和模型試圖矩陣

     gl.vertexAttribPointer(shaderVertexPositionAttribute, obj.vertSize, gl.FLOAT, false, 0, 0);

     gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, projectionMatrix);

     gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, modelViewMatrix);

     // 繪製物體

     gl.drawArrays(obj.primtype, 0, obj.nVerts);

}

相關焦點

  • 令人激動的新興 Web 技術:WebGL和SVG
    http://dev.opera.com/articles/view/an-introduction-to-webgl/作者 Luz Caballero,簡介可以獲得的各種庫。  Raw WebGL 101。http://dev.opera.com/articles/view/raw-webgl-part1-getting-started/適合那些不使用庫的用戶。
  • 手把手教你學Numpy——常用API合集
    前面幾個都比較好理解,簡單介紹一下這個百分位數,它是指將元素從小到大排列之後,排在第x%位上的值。我們一般常用的是25%,50%和75%這三個值,通過這幾個值,我們很容易對於整個特徵的分布有一個大概的了解。前面三個指標:均值、方差、標準差都很好理解,我們直接看代碼就行。
  • Node.js 入門 - 使用 Express + Sequelize 實作 API
    無論你是使用 Webpack來打包前端項目,或者來開發Api接口,還是使用 React Native開發原生 App,亦或是開發桌面軟體,Node.js都是必不可少的東西了。Node.js 是一個基於 Chrome V8 引擎的 Javascript 運行環境課程主要講解 如何使用 nvm來安裝 Node.js,以及 npm的用法。
  • webgl 迷宮項目開發總結
    收穫webgl 三個js庫webgl-utils.jswebgl-debug.jscuon-utils.js圖片加載var img = new Image();這樣可以防止webgl在渲染的時候圖片還沒加載完而出現黑屏的問題。監聽鍵盤事件保證事件代碼只運行一次。否則會重複綁定多個事件,也就是按鍵一次會觸發多次事件處理。
  • WebGL 入門 – WebGL框架
    大致理解了WebGL的原生API後,可以說對於完全不了解OpenGL或者三維設計的Web開發者來說是十分生澀難懂的。但是,也有很多人基於WebGL開發出了各種開源框架,現在,我們就來看看目前有哪些框架能夠為我們所用。
  • Azure 靜態 web 應用集成 Azure 函數 API
    但是一個真正的web應用,總是免不了需要後臺api服務為前端提供數據或者處理數據的能力。同樣前面我們也介紹了Azure函數服務,Azure函數的http trigger可以對http作出響應,可以完美的承當web api的角色。現在Azure靜態web應用可以直接集成Azure函數,使得一次發布可以同時發布前端項目(vue、blazor)及後臺api服務(azure函數)。
  • 八大瘋狂的 HTML5 Canvas 及 WebGL 動畫效果
    原文地址:http://favbulous.com/post/895/8-crazy-animations-withwebgl-and-html5-canvas文/hiwebgl
  • 如何在Internet Explorer 11中開啟WebGL
    目前IE 11對WebGL的支持度仍然非常有限,你可以把一下代碼另存為HTML文件,然後在IE 11中打開,你會發現網頁中出現一片藍色的區域,而這正代表著網頁成功獲得了名為「experimental-webgl」的3D繪製上下文——Internet Explorer 11終於支持WebGL了!
  • Baidu與Google地圖API初探
    Google、QQ和MapBar等4種Map API(都是採用JS開放API),也查看了它們的SDK開發文檔,談談自己的體會 Map API文檔 BMap API(Baidu)與google.maps API(Google)文檔相對最完備、詳盡、簡潔,並且給出了很多學習示例,非常適合初學者入門學習
  • WebGL 3D程序開發
    http://webglsamples.org/ 這個網址展示了Google發布的一些示例WebGL程序,在驚嘆美輪美奐的效果的同時,我們發現發布和運行也變得非常簡單。下方運營:weikashouji
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • python入門第十四課:API的調用
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes我們經常需要使用Python調用Web應用編程接口(API),大部分的API返回的都是易於處理的格式(如JSON或CSV),本節演示如何處理返回類型為JSON的API。
  • 學了這麼久C/C+,還沒有入門?
    首先是語言的選擇,C/C++,百度應該有很多的,如果你剛剛入門,那麼請專注於你所學的那一門語言,專注,無論它現在是否流行。 在沒有開發出幾個窗體程序之前,請準備好足夠的耐心,最好把耐心的技能樹給點滿了。
  • RStudio介紹及入門
    Hello,這裡是行上行下,我是喵君姐姐~上一期寫了R語言的入門及安裝,得到了很多小夥伴的喜歡。在忙完了畢業之後,終於有時間可以抽空寫R語言系列的教程啦!那今天就請Ten years old詳細講解一下,RStudio介紹及入門。R是統計領域廣泛使用的工具,屬於GNU系統的一個自由、免費、原始碼開放的軟體,是用於統計計算和統計繪圖的優秀工具。
  • Restful Api-接口設計
    獲取資源 POST(CREATE)創建資源 PATCH(UPDATE)更新資源的部分屬性(很少用,一般用POST代替) PUT(UPDATE)更新資源,客戶端需要提供新建資源的所有屬性 DELETE(DELETE)刪除資源使用方式 GET http://www.birjemin.com/api
  • 網際網路編程如何入門,學習路徑又是什麼?
    今天給大家來講一講網際網路學習編程以及如何入門等相關知識。1.先學會C++和socket或者windows的http server api做一個http server,做一個小網站。
  • WebGL 1.0標準規範正式公布 3D網際網路開啟
    WebGL 1.0正式版標準規範全文:http://www.khronos.org/registry/webgl/specs/latest/
  • 基於WebGL的虛擬太陽系漫遊技術實現 ThingJS 科幻片
    比起Three.js的開源技術探索者風格,ThingJS是更為頂層的封裝庫,ThingJS繼承了webgl的技術優點,並且提供了較為全面的物聯網開發邏輯(如地球、城市、建築、設備等等)。ThingJS開發特點如下:掩蓋了渲染細節。將 webGL原生API的細節抽象化,3D場景拆解為網格、材質和光源。面向對象。
  • 使用C#的後端Web API:循序漸進教程
    本教程介紹如何使用C#(ASP.NET)構建自己的Web伺服器(Web API)。重要的是要注意,要託管您的伺服器,您將需要基於Windows的託管。先決條件我想我們可以開始了。注意routeTemplate: "api/{controller}/{id}",它解釋了API路由。現在,讓我們做一個基本的例子。在本教程中,我們將為用戶準備一個API,這是每個系統的一個非常通用的實體/對象。