国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > OpenGL,WebGL基于HTML5/WebGL的建模及構建3D場景

OpenGL,WebGL基于HTML5/WebGL的建模及構建3D場景

時間:2023-08-29 02:18:01 | 來源:網(wǎng)站運營

時間:2023-08-29 02:18:01 來源:網(wǎng)站運營

OpenGL,WebGL基于HTML5/WebGL的建模及構建3D場景:

一、OpenGL和WebGL概述

WebGL基于OpenGL ES,它缺少常規(guī)OpenGL具有的許多功能,例如僅支持頂點和片段著色器。OpenGL具有WebGL所不具備的功能,例如幾何體著色器,鑲嵌細分著色器和計算著色。在PC端web應用中,前端的webgl是通過js語句調用的是OpenGL部分接口,在移動設備是調用OpenGL ES部分接口來實現(xiàn)頁面的圖形渲染。WebGL只是綁定外面接口的一層。

Webgl、OpenGL

二、webGL和openGL的區(qū)別

WebGL和openGL的區(qū)別為:性質不同、插件支持不同、用途不同。WebGL 2.0基于OpenGL ES 3.0,確保了提供許多選擇性的WebGL 1.0擴展,并引入新的API。

一、性質不同

1、webGL:webGL的為。是一種用于展示各種3D模型和場景的繪圖協(xié)議,并提供了3D圖形的API。

2、openGL:openGL是用于渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。

二、插件支持不同

1、webGL:webGL利用底層的圖形硬件加速功能進行的圖形渲染作,無需任何瀏覽器插件支持。

2、openGL:openGL通過HTML腳本本身實現(xiàn)Web交互式三維動畫的制作,需要瀏覽器插件支持。

三、用途不同

1、webGL:webGL可被用于創(chuàng)建具有復雜3D結構的網(wǎng)站頁面,甚至可以用來設計3D網(wǎng)頁游戲等等。

2、openGL:openGL用于CAD、虛擬現(xiàn)實、科學可視化程序和電子游戲開發(fā)。

OpenGL:

OpenGL(Open Graphics Library),開放圖形庫/開放式圖形庫,用于渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API),這個接口由近350個不同的函數(shù)調用組成,用來繪制從簡單的圖形比特到復雜的三維景象,而另一種程序接口系統(tǒng)是僅用于Microsoft Windows上的Direct3D,OpenGL常用于CAD、虛擬現(xiàn)實、科學可視化程序和電子游戲開發(fā)。

WebGL:

WebGL是一種 3D繪圖標準,允許把JavaScript和OpenGL ES 2.0結合在一起,通過增加OpenGL ES 2.0的一個JavaScript綁定,WebGL可以為HTML5 Canvas提供硬件3D加速渲染,Web開發(fā)人員就可以借助系統(tǒng)顯卡來在瀏覽器里更流暢地展示3D場景和模型了,還能創(chuàng)建復雜的導航和數(shù)據(jù)視覺化。顯然,WebGL技術標準免去了開發(fā)網(wǎng)頁專用渲染插件的麻煩,可被用于創(chuàng)建具有復雜3D結構的網(wǎng)站頁面,甚至可以用來設計3D網(wǎng)頁游戲等等。

webgl、OpenGL

三、基于HTML5/WebGL的建模

WebGL,定義了一套API,能夠允許在網(wǎng)頁中的canvas標簽中使用類似于Open GL,實際上是一套基于OpenGL ES 2.0的3D圖形API。

WebGL特點與優(yōu)勢:

1、WebGL內嵌在瀏覽器中,不需要安裝插件和庫就可以直接使用;

2、由于WebGL基于瀏覽器,不是基于操作系統(tǒng)。所以可以直接在多種平臺運行WebGL程序;

3、WebGL程序由HTML和JavaScript文件組成,可以直接發(fā)送給對方在瀏覽器中展示;

4、不需要搭建開發(fā)環(huán)境,可以直接通過文本編輯器開發(fā);

5、由于WebGL繼承自OpenGL,所以OpenGL相關資料都可以拿來參考。

WebGL的基本圖元包括:點、線段、三角形。

四、一個代碼案例分析:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>繪制三角形</title> <link rel="stylesheet" href="styles/app.css"></head><body> <canvas id="canvas"></canvas> <script> const random = Math.random; /** * 獲取隨機顏色 * @returns { Object } 顏色對象 */ function randomColor () { return { r: random() * 255, g: random() * 255, b: random() * 255, a: random() * 1 } } const canvas = document.querySelector('#canvas'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; const gl = canvas.getContext('webgl'); gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); // 頂點著色器 const vertexShaderSource = ` // 設置浮點數(shù)據(jù)類型為中級精度 precision mediump float; // 接收頂點坐標 (x,y) attribute vec2 a_Position; void main () { gl_Position = vec4(a_Position, 0.0, 1.0); } `; const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); // 片元著色器 const fragmentShaderSource = ` // 設置浮點數(shù)據(jù)類型為中級精度 precision mediump float; // 接收 JavaScript 傳過來的顏色值(rgba) uniform vec4 u_Color; void main(){ vec4 color = u_Color / vec4(255, 255, 255, 1); gl_FragColor = color; } `; const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader,fragmentShaderSource); gl.compileShader(fragmentShader); // 著色器程序 const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program); // 獲取著色器程序中變量的指針位置 const a_Position = gl.getAttribLocation(program, 'a_Position') const u_Color = gl.getUniformLocation(program, 'u_Color'); // 定義三角形的三個頂點 const positions = [ 0, 0.5, // 上頂點 -0.5, -0.5, // 左頂點 0.5, -0.5 // 右頂點 ]; // 創(chuàng)建緩沖區(qū) const buffer = gl.createBuffer(); // 綁定緩沖區(qū)并指定緩沖區(qū)的類型 gl.bindBuffer(gl.ARRAY_BUFFER, buffer); // 往緩沖區(qū)中寫入數(shù)據(jù) gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); // 將屬性綁定到緩沖區(qū) gl.enableVertexAttribArray(a_Position); // 如何讀取緩沖區(qū)數(shù)據(jù) // 指定要修改的頂點屬性的索引(允許哪個屬性讀取當前緩沖區(qū)的數(shù)據(jù)) - a_Position // 指定每個頂點屬性的組成數(shù)量(一次讀取幾個數(shù)據(jù)) - 2 // 指定數(shù)組中每個元素的數(shù)據(jù)類型 - gl.FLOAT(32 位 IEEE 標準的浮點數(shù),占用 4 個字節(jié)) // 當轉換為浮點數(shù)時是否應該將整數(shù)數(shù)值歸一化到特定的范圍 - false(對于類型 gl.FLOAT 和 gl.HALF_FLOAT,此參數(shù)無效) // 步長(即:每個頂點所包含數(shù)據(jù)的字節(jié)數(shù))0 表示一個屬性的數(shù)據(jù)是連續(xù)存放的 // 偏移量(指定頂點屬性數(shù)組中第一部分的字節(jié)偏移量)(在每個步長的數(shù)據(jù)里,目標屬性需要偏移多少字節(jié)開始讀取;必須是類型的字節(jié)長度的倍數(shù))0 * 4 = 0 gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0); // 隨機顏色 const { r, g, b, a } = randomColor(); // 向片元著色器傳遞顏色信息 gl.uniform4f(u_Color, r, g, b, a); // 繪制三角形 // 指定繪制圖元的方式 - gl.TRIANGLES(三角形) // 指定從哪個點開始繪制 - 0 // 指定繪制需要使用到多少個點 - 3 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3); </script></body></html>

關鍵詞:場景

74
73
25
news

版權所有? 億企邦 1997-2025 保留一切法律許可權利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉