webgl 迷宮項目開發總結

項目簡介

webgl 迷宮項目開發總結


項目分為兩個部分:

第一部分是一個迷宮Maze, 首先生成矩形cell數組,每個cell有4個side,然後一步一步地remove side(不包括迷宮邊緣的side),直到全部的cell 都連通(connected)。然後在迷宮的左邊緣創建一個入口,在右邊緣創建一個出口。

整體網頁需要接收2個參數:N和M, 迷宮的大小為N*M。


第二部分是交互操作Guide。在迷宮入口設置一個老鼠圖片,然後可以通過左右鍵調整老鼠的朝向,方向鍵上來前進一步。


收穫

webgl 三個js庫

webgl-utils.js

webgl-debug.js

cuon-utils.js

圖片加載

var img = new Image();

img.src = './rat.png';

img.onload = function(){

​img_loaded = true;

}

圖片應該最先加載。這樣可以防止webgl在渲染的時候圖片還沒加載完而出現黑屏的問題。

監聽鍵盤事件

保證事件代碼只運行一次。否則會重複綁定多個事件,也就是按鍵一次會觸發多次事件處理。


document.addEventListener("keyup",function (event) {

switch (event.keyCode)


渲染多個物體到同一個canvas

不能再用initShader方法了,而是需要創建多個program:

program = createProgram(gl, VSHADER_SOURCE, FSHADER_SOURCE)

program2 = createProgram(gl, VSHADER_SOURCE_2, FSHADER_SOURCE_2)


然後在需要渲染的時候, 主動切換不同的program:

gl.useProgram(program);


渲染圖片時背景透明:

// gl.enable(gl.BLEND);

// gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);

圖片尺寸:

長寬都應該為2^N,長寬可以不同。 比如為128px, 256px, 512px

否則無法渲染。


cell的連通性如何判斷:


使用bfs 廣度優先算法, 從任意一個cell開始,如果能遍歷到全部的cell(可以弄個set來保存並判斷長度),即cell全連通了。


如何更有效地remove side:

隨機的方法雖然寫起來簡單,但是很難取得最優解。

可以這樣:

隨機選擇一個side, 在remove 之前,記錄cell 0 連通的cell總個數。

然後remove。 再次記錄cell 0連通的cell總個數。

如果remove前後連通的cell總個數不變, 則回滾remove操作。 並進入下一次循環。


改變圖片朝向:

Float32Array 是 4 x 4的, 每行是一個頂點, 每行裡面的最後2個float表示朝向

if (current_direction == 0) {

// down

a_1 = 0; a_2 = 1;

b_1 = 0; b_2 = 0;

c_1 = 1; c_2 = 1;

d_1 = 1; d_2 = 0;

} else if(current_direction ==1) {

// right

a_1 = 0; a_2 = 1;

b_1 = 1; b_2 = 1;

c_1 = 0; c_2 = 0;

d_1 = 1; d_2 = 0;

} else if (current_direction == 2) {

// up

a_1 = 1; a_2 = 0;

b_1 = 1; b_2 = 1;

c_1 = 0; c_2 = 0;

d_1 = 0; d_2 = 1;

} else if (current_direction == 3) {

// left

a_1 = 1; a_2 = 0;

b_1 = 0; b_2 = 0;

c_1 = 1; c_2 = 1;

d_1 = 0; d_2 = 1;

}


Float32Array 是 4 x 4的, 每行是一個頂點,每行裡面的前2個float是x和y座標,加一個delta值即可。


其它:

attribute 類型的變量: gl.getAttribLocation 之後如果返回值 < 0, 則為失敗。

uniform 類型的變量: gl.getUniformLocation 之後, 如果 ! , 則為失敗。

渲染圖片時瀏覽器無法加載本地文件,需要把網頁放到webserver裡面運行。


分享到:


相關文章: