慕斯王
2023-05-25 16:05:18
我正在嘗試使用 WebGL 創(chuàng)建游戲。我目前有三種紋理,一種是字體字母,一種是角色精靈表,另一種是世界地圖。所以我有一些大紋理,我需要多次繪制其中的一小部分。做這個(gè)的最好方式是什么?我目前的方法是為每個(gè)字母、地圖上的正方形、角色姿勢(shì)等使用一個(gè) VAO……所以我會(huì)有 150 多個(gè) VAO。我認(rèn)為 VAO 很好,因?yàn)樗鼈兗群?jiǎn)單又快速,但是this、this和其他讓人覺得這不是最好的選擇。例如,我知道的另一種方法是只有三個(gè) VAO,并更改 WebGL 在緩沖區(qū)中開始讀取的位置以獲得正確字母的位置。因此,我不會(huì)使用數(shù)百個(gè)帶有微型陣列的 VAO,而是使用三個(gè)帶有大型陣列的 VAO。如果這是正確的方法,我是否必須在每次繪制內(nèi)容時(shí)都在 gl.enablevertexAttribArray() 之后調(diào)用 gl.vertexAttribPointer() ,還是只修改 gl.drawArrays() 中的計(jì)數(shù)參數(shù)?gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ) 是 16 或 32,所以切碎紋理似乎也不是一個(gè)好方法。最好的概念方法是什么?
1 回答

GCT1015
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
有多少 VAO 由您決定。有很多權(quán)衡。就文本而言,最常見的文本方式是將字形放入紋理圖集中,并生成一個(gè)緩沖區(qū),其中包含要繪制的所有字母的頂點(diǎn)。
換句話說(shuō)。
each frame
? ?for each string
? ? ? for each letter in string
? ? ? ? ?add vertices for letter to buffer
drawArray/drawElements(gl.TRIANGLES, ... totalOfAllLettersInAllStrings * 6);
因此,所有字母(如 UI)可能只有一次繪制調(diào)用。每個(gè)字母沒有一個(gè)。那將是放慢速度的方式。
就繪制文本而言,對(duì)于簡(jiǎn)單的情況,通常每種字體樣式只需要一個(gè)紋理。雖然如果你想支持所有的 unicode 而不是僅僅支持 ASCII,它會(huì)很快變得復(fù)雜。
添加回答
舉報(bào)
0/150
提交
取消