WebGL(四)初入三維世界

2021-10-05 08:07:16 字數 2405 閱讀 6812

在說完矩陣相關的知識後,就可以進入三維世界了。三維世界有兩個很基本的東西:

相機:採用另外一種繪製方式gl.drawelements(),它與之前的gl.drawarrays(),不同,能夠避免重複定義頂點,保持頂點數最小。不過,這個新引進乙個概念就是,索引,它和陣列中的索引概念類似,頂點存在陣列中,通過頂點索引寫入快取區,繫結到gl.element_array_buffer上。使用方法類似於gl.drawarrays()。

void gl.drawelements(mode, count, type, offset);

引數

整數型 指定要渲染的元素數量.

列舉型別 指定元素陣列緩衝區中的值的型別。可能的值是:

gl.unsigned_byte

gl.unsigned_short

當使用 oes_element_index_uint 擴充套件時:

gl.unsigned_int

位元組單位 指定元素陣列緩衝區中的偏移量。必須是給定型別大小的有效倍數.

function initvertexbuffers(gl) 

//將頂點座標和顏色寫入緩衝區物件

gl.bindbuffer(gl.array_buffer, vertexcolorbuffer);

gl.bufferdata(gl.array_buffer, verticescolors, gl.static_draw);

var fsize = verticescolors.bytes_per_element;

// 將緩衝區頂點資料分配給a_position 並開啟

var a_position = gl.getattriblocation(gl.program, 'a_position');

if(a_position < 0)

gl.vertexattribpointer(a_position, 3, gl.float, false, fsize * 6, 0);

gl.enablevertexattribarray(a_position);

// 將緩衝區顏色資料分配給a_color並開啟

var a_color = gl.getattriblocation(gl.program, 'a_color');

if(a_color < 0)

gl.vertexattribpointer(a_color, 3, gl.float, false, fsize * 6, fsize * 3);

gl.enablevertexattribarray(a_color);

// 將頂點索引資料寫入緩衝區物件

gl.bindbuffer(gl.element_array_buffer, indexbuffer);

gl.bufferdata(gl.element_array_buffer, indices, gl.static_draw);

return indices.length;

}......

//繪製立方體

在真實世界中,如果把盒子一前一後放置在桌子上的話,前面的盒子會擋住部分後面的盒子。但在webgl預設情況下,不是如此,為了加快繪圖,是按照頂點在緩衝區中的順序來處理它們的,只有先定義遠的物體,再定義近的物體,才能產生正確的效果。

隱藏面消除

為了解決上個問題,webgl提供了隱藏面消除功能。它會幫助我們消除那些被遮擋的表面(隱藏面),這樣不用考慮頂點在緩衝區中的順序,遠處的物體自動會被近處的物體遮擋。

開啟隱藏面消除功能

gl.enable(gl.depth_test);
在繪製之前,清除深度緩衝區

gl.clear(gl.depth_buffer_bit);
深度衝突

當兩個幾何圖形或者是兩個表面特別接近(比如兩個三角形x、y接近,z值完全相同)的時候,會出現新的問題,使得表面看起來斑斑駁駁的,這種現象稱為深度衝突。webgl提供一種被稱為多邊形偏移的機制來解決這個問題。該機制將自動在z值加上乙個偏移量,偏移量的值有物體表面相對觀察值視線的角度來確定。

啟動多邊形偏移

gl.enable(gl.polygon_offset_fill),;
在繪製之前指定用來計算偏移量的引數

gl.polygonoffset(1.0,1.0);
以上只是很簡單的三維世界,光照,陰影還有其他各種效果,我們都沒有考慮,道路艱且長啊。

三維世界的Gizmos

今天在美術同事那兒了解些maya常識,加上自己在unity3d中的一點兒小操作,記錄一下gizmos 之前就知道maya和unity3d的軸向是一致的,在同事那兒看他操作maya之後,發現這兩者在操作上有一些類似。有趣的是unity3d和maya頂部的工具條的操作是十分類似的。transform操作...

三維世界的Gizmos

今天在美術同事那兒了解些maya常識,加上自己在unity3d中的一點兒小操作,記錄一下gizmos 之前就知道maya和unity3d的軸向是一致的,在同事那兒看他操作maya之後,發現這兩者在操作上有一些類似。有趣的是unity3d和maya頂部的工具條的操作是十分類似的。transform操作...

webgl開源三維引擎的選擇

webgl發展的很快,可謂日新月異,所以下面的這些引擎過乙個月,半年可能就不是現在這樣了,對應的連線位址以方便檢視比較。一。小場景的開源三維js引擎 1.babylonjs 當前在用 優點 有微軟背景,有不少的demo,有較詳細的api文件,有供測試的平台,有提供3dsmax轉換模型的外掛程式,缺點...