WebGL 繪製Line的bug 三

2021-08-04 08:29:59 字數 2351 閱讀 4718

之前鋪墊了許多,今天可以來分享點純乾貨了。

bk.line3d = function (points,colors)

bk.line3d.prototype.computedata = function()

if (i > 0)

var idx = 3 * i;

var i2 = i * 2;

offset[i2 + 0] = 5;

offset[i2 + 1] = -5;

}var end = count - 1;

for(i = 0;i < 6 ;i ++)

for(i = 0;i < indicescount ;i ++)else

}this.position = position;

this.positionnext = positionnext;

this.positionprev = positionprev;

this.color = color;

this.offset = offset;

this.indices = indices;

};

**首先定義了乙個類,該類建構函式可以傳入端點陣列;在該類上定義了乙個方法 computedata,用來計算頂點陣列,每個頂點包括上文所述的4個資訊,另外增加了乙個顏色資訊。

讀者,可以結合第二篇的思路和上面的**來來理解,此處不再詳述 **的細節。

另外乙個比較重要的**是頂點著色器中,通過傳入的這些頂點資訊來計算最終的頂點座標,**如下:

var linevs = `

attribute

vec3 aposition;

attribute

vec3 apositionpre;

attribute

vec3 apositionnext;

attribute

float aoffset;

attribute

vec3 acolor;

varying

vec3 vcolor;

uniform

mat4 uworldviewprojection;

uniform

vec4 uviewport;

uniform

float unear;

uniform

mat4 uviewmatrix;

uniform

mat4 uprojectmatrix;

vec4 clipnear(vec4 p1,vec4 p2)

void main()else

}vec2 prevscreen = (prevproj.xy / abs(prevproj.w) + 1.0) * 0.5 * uviewport.zw;

vec2 currscreen = (currproj.xy / abs(currproj.w) + 1.0) * 0.5 * uviewport.zw;

vec2 nextscreen = (nextproj.xy / abs(nextproj.w) + 1.0) * 0.5 * uviewport.zw;

vec2 dir;

float len = aoffset;

if(aposition == apositionpre)else

if(aposition == apositionnext)else

dir = vec2(-dir.y,dir.x) * len;

currscreen += dir;

currproj.xy = (currscreen / uviewport.zw - 0.5) * 2.0 * abs(currproj.w);

vec4 pos = uprojectmatrix * uviewmatrix * vec4(aposition,1.0);

vcolor = acolor;

gl_position = currproj;

}`;

計算的原理,也可以參考第二篇的論述,此處需要注意的是,為了能夠計算頂點在螢幕上的最終位置,需要把canvans的尺寸大小傳遞給著色器(uniform 變數 uviewport),同樣為了計算裁剪,需要把鏡頭的near值傳遞給著色器(uniform 變數 unear),而變數uworldviewprojection表示模型檢視透視變換的矩陣,熟悉webgl的同學一定清楚。

如果你對webgl 感興趣,可以了解下我們用webgl開發的3d機房專案:

html5,不只是看上去很美(第二彈:打造最美3d機房)

關於這個話題就先分享到這裡了,如果大家對其它方面與興趣的,我們也可以一起來**。

WebGL 繪製Line的bug 三

bk.line3d function points,colors elseelse else if aposition apositionnext else vec2 dira normalize currscreen prevscreen vec2 dirb normalize nextscree...

WebGL 繪製Line的bug 二

以兩個端點組成的線段為例,繪製line的時候只用指定兩個端點,如果通過三角形來模擬一條線段,則至少需要兩個三角形,如下圖 這是兩個三角形模擬的線段。因此要繪製一條線段,則需要六個頂點,兩個三角形 當時從上圖中,可以看出有些頂點是共享,實際上只需要四個頂點,然後通過索引的方式繪製兩個三角形,相信熟悉w...

WebGL 繪製和變換

1.使用緩衝區物件向頂點著色器傳入多個頂點的資料,需要遵循以下五個步驟 1.1 建立緩衝區物件 gl.createbuffer 1.2 繫結緩衝區物件 gl.bindbuffer 1.3 將資料寫入緩衝區物件 gl.bufferdata 1.4 將緩衝區物件分配給乙個attribute變數 gl.v...