在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ WebGL幾何體
WebGL Context上下文
WebGL圖形管線
WebGL示例程序
WebGL交互式立方體
WebGL繪制三角形
WebGL幾何體
WebGL繪制模型
WebGL基礎(chǔ)
WebGL平移
WebGL教程
WebGL繪圖的模式
WebGL縮放
WebGL繪制點
WebGL顏色
WebGL旋轉(zhuǎn)
WebGL繪制四邊形
WebGL著色器程序
WebGL基本圖形概念
WebGL立方體旋轉(zhuǎn)
WebGL關(guān)聯(lián)屬性和緩沖區(qū)對象
Html5 Canvas介紹
WebGL著色器

WebGL幾何體

所有原語(或?qū)ο竽P?應(yīng)該有明確定義的幾何細節(jié)。這些細節(jié)可以包括頂點,指數(shù),顏色,紋理等。在WebGL中幾何詳細信息存儲在JavaScript數(shù)組。
圖形對象由其中在GPU上運行的著色器程序來創(chuàng)建。幾何信息傳遞到使用緩沖區(qū)對象著色器程序。

定義所需的幾何體

使用頂點所繪的2D或3D模型被稱為網(wǎng)格。在網(wǎng)格的每個面被稱為多邊形和多邊形是由3個或更多的頂點組成。
要繪制模型在WebGL中渲染,必須定義使用 JavaScript 數(shù)組的頂點和索引。舉例來說,如果我們想創(chuàng)建一個三角形的位于坐標{(5,5),(5,5),(-5,-5)}如圖所示,圖中,那么可以創(chuàng)建一個數(shù)組的頂點-
var vertices = [
   0.5,0.5,  //Vertex 1
   0.5,-0.5, //Vertex 2
  -0.5,-0.5, //Vertex 3
]; 
Geometry

同樣,可以創(chuàng)建一個數(shù)組的索引。指數(shù)為上述三角形索引將是[0,1,2],可以定義為 -
var indices = [ 0,1,2 ]
為了更好地理解索引,考慮更多復(fù)雜的模型,如正方形。我們可以代表一個正方形為一組的兩個三角形。如果(0,3,1)和(3,1,2)是用兩個三角形,我們打算繪制一個正方形,那么索引將被定義為 -
var indices = [0,3,1,3,1,2];
Geometry Example


注意 ?

對于繪圖圖元,WebGL 提供了以下兩種方法 -
  • drawArrays() ? 當使用這種方法,我們通過原語使用JavaScript數(shù)組的頂點。

  • drawElements() ? 當使用這種方法,我們通過這兩個頂點和原語使用JavaScript數(shù)組的索引。

緩沖區(qū)對象

緩沖對象是由WebGL的提供了一個機制,用于指示分配到系統(tǒng)中的存儲器區(qū)域。在這些緩沖區(qū)對象,可以存儲要繪制模型的數(shù)據(jù),對應(yīng)的頂點,索引,顏色等。
使用這些緩沖區(qū)對象,可以通過它的屬性變量中的一個傳遞多個數(shù)據(jù)的著色器程序(頂點著色器)。由于這些緩沖對象駐留在GPU存儲器,它們可以被直接呈現(xiàn),這反過來又提高了性能。
為了處理幾何形狀,有兩種類型的緩沖區(qū)的對象。他們是-
  • 頂點緩沖區(qū)對象 (VBO) ? 它保持所述圖形模型,要被渲染的每個頂點的數(shù)據(jù)。我們使用頂點緩沖對象中的WebGL存儲和處理關(guān)于頂點諸如頂點坐標,法線,色彩,紋理坐標數(shù)據(jù)。

  • 索引緩沖區(qū)對象(IBO) ? 它保持所述圖形模型的索引(索引數(shù)據(jù)),這是要被渲染的。

    限定所需的幾何形狀和它們存儲在JavaScript數(shù)組,需要將這些陣列傳遞給對象緩沖器,數(shù)據(jù)將被傳遞到著色器程序。下面的步驟是在緩沖器要遵循數(shù)據(jù)存儲。
  • 創(chuàng)建一個空的緩沖區(qū)。
  • 綁定相應(yīng)的數(shù)組對象為空緩沖區(qū)。
  • 傳遞數(shù)據(jù)(頂點/索引)使用類型數(shù)組的一個緩沖區(qū)。
  • 取消綁定緩存(可選)。

注?

WebGL提供了一種特殊類型數(shù)組稱為類型數(shù)組來傳輸數(shù)據(jù)元素,如索引頂點和紋理。這些類型的數(shù)組存儲大量數(shù)據(jù)并處理它們在本地二進制格式,這將產(chǎn)生更好的性能。使用WebGL類型數(shù)組是Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,UInt32Array,F(xiàn)loat32Array和Float64Array。
  • 通常,用于存儲頂點數(shù)據(jù),我們用Float32Array; 要存儲索引數(shù)據(jù),我們使用Uint16Array。
  • 可以創(chuàng)建類型數(shù)組就像使用new關(guān)鍵字JavaScript數(shù)組。
現(xiàn)在,讓我們來了解步驟存儲在緩沖區(qū)的數(shù)據(jù) -

創(chuàng)建緩沖區(qū)

要創(chuàng)建一個空的緩沖區(qū)對象,WebGL提供了一個名為createBuffer()的方法。該方法如果創(chuàng)建成功,返回一個新創(chuàng)建的緩沖區(qū)對象; 否則返回失敗的情況下一個 null 值。
WebGL操作為狀態(tài)機。一旦緩沖器被創(chuàng)建,任何后續(xù)緩沖操作將在當前緩沖器被執(zhí)行,直到我們解除綁定它。使用下面的代碼來創(chuàng)建緩沖區(qū) -
var vertex_buffer = gl.createBuffer();

注 ? gl 是參考變量的當前的 WebGL 的上下文。

綁定緩沖

創(chuàng)建一個空的緩沖區(qū)對象后,需要一個合適的數(shù)組緩沖區(qū)(目標)綁定到它。 WebGL提供)用于此目的稱為bindBuffer() 方法。

語法

bindBuffer()方法的語法如下 ?

void bindBuffer (enum target, Object buffer)
這個方法有兩個參數(shù),它們將在下面討論。

target ? 第一變量是一個枚舉值,表示我們要綁定到空緩沖器的緩沖的類型。有兩個預(yù)定義枚舉值作為該參數(shù)選項。他們是-

  • ARRAY_BUFFER  表示頂點的數(shù)據(jù)。

  • ELEMENT_ARRAY_BUFFER 表示索引數(shù)據(jù)。

Object buffer ? 第二個是參考變量,在上一步中創(chuàng)建的緩沖區(qū)對象。參考變量可以是一個索引緩存對象或頂點緩沖對象。

示例

下面的代碼片段展示了如何使用 bindBuffer()方法。
//vertex buffer
var vertex_buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);

//Index buffer
var Index_Buffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);

數(shù)據(jù)傳遞到緩沖區(qū)

下一步驟是將數(shù)據(jù)(頂點/索引)傳送給緩沖器。截至目前數(shù)據(jù)是一個數(shù)組的形式在傳遞到緩沖區(qū)之前,我們需要把它包在WebGL的一個類型數(shù)組。 WebGL提供用于此目的 的 bufferData()方法。

語法

bufferData()方法的語法如下 -
void bufferData (enum target, Object data, enum usage)
這個方法接受三個參數(shù),它們將在下面討論 -

target ? 第一個參數(shù)是一個枚舉值,表示我們使用了數(shù)組中緩沖的類型。它們可以是ARRAY_BUFFER或ELEMENT_ARRAY_BUFFER。

Object data ? 第二個參數(shù)是包含數(shù)據(jù)寫入到緩沖對象的對象的值。在這里,我們使用類型數(shù)組來傳遞數(shù)據(jù)。

Usage ? 該方法的第三個參數(shù)是一個枚舉變量,來指定如何使用緩沖區(qū)對象的數(shù)據(jù)(存儲的數(shù)據(jù))來繪制形狀。有三種選擇此參數(shù)如下表所示。

  • gl.STATIC_DRAW ? 數(shù)據(jù)將指定一次,多次使用。

  • gl.STREAM_DRAW ? 數(shù)據(jù)將指定一次,使用幾次。

  • gl.DYNAMIC_DRAW ? 數(shù)據(jù)將被重復(fù)指定和多次使用。

示例

下面的代碼片段展示了如何使用bufferData()方法。假設(shè)頂點和指數(shù)分別保持在頂點和索引數(shù)據(jù)的數(shù)組。
//vertex buffer
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

//Index buffer
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);

取消綁定緩沖區(qū)

建議解除綁定緩存使用后。它可以通過使一個零值代替緩沖對象來完成,如下所示。
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
WebGL提供以下方法來執(zhí)行緩沖區(qū)操作 -
S.No.
方法及說明
1

void bindBuffer (enum target, Object buffer)

target ? ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER

2

void bufferData(enum target, long size, enum usage)

target ? ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER

usage ? STATIC_DRAW, STREAM_DRAW, DYNAMIC_DRAW

3

void bufferData (enum target, Object data, enum usage)

target and usage ? Same as for bufferData above

4

void bufferSubData(enum target, long offset, Object data)

target ? ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER

5 Object createBuffer()
6 void deleteBuffer(Object buffer)
7

any getBufferParameter(enum target, enum pname)

target ? ARRAY_BUFFER, ELEMENT_ ARRAY_BUFFER

pname ? BUFFER_SIZE, BUFFER_USAGE

8 bool isBuffer(Object buffer)

上一篇:WebGL基礎(chǔ)下一篇:WebGL旋轉(zhuǎn)