JavaScript WebGL 使用圖片疑惑點

XXHolic發表於2022-01-12

引子

JavaScript WebGL 使用圖片之後產生了一些疑問。

為什麼紋理座標取幾個點就可以獲取圖片內容?

WebGL 中影像的座標系原點位於左下角,水平正方向向右,垂直正方向向上。紋理座標是表示影像中位置的兩個分量。第一個分量 s 是距離影像左側的百分比。第二個分量 t 是距離影像底部的百分比。WebGL 中幾何體最終都是由三角形構成,使用圖片的時候不一定都是三角形,需要使用紋理座標指定對應分解的三角形頂點在影像中的位置。為了讓紋理座標適用任何影像,使用百分比指定位置。

97-image-coor

根據上面的資訊可知,紋理座標跟繪製的頂點有關聯,繪製頂點的方式,同樣影響到獲取紋理。

紋理座標跟頂點座標一定要一一對應?

嘗試了一下,例如 4 個頂點,但只提供了 3 個頂點對應的紋理座標,出現下面提示:

WebGL warning: drawElementsInstanced: Indexed vertex fetch requires 4 vertices, but attribs only supply 3.

但多餘頂點座標數倒是沒有影響。

啟用紋理和繫結紋理目標的順序是否有要求?

不使用預設的紋理單元 gl.TEXTURE0 比較好看到區分:

可以發現紋理需要先啟用後繫結

這裡還需要注意的是建立紋理的時候會 bindTexture 一次,但這個不一定最終生效,在使用的時候保險起見最好再繫結一次,看到一些示例都是把建立和使用紋理的邏輯區分開。

相同位置多個紋理會怎麼樣?

在前面我們知道紋理都有所屬的紋理單元,繪製的時候,需要啟用對應的紋理單元。那麼就有下面的情況:

  • 一套頂點,但關聯多次紋理單元
  • 兩套相同位置頂點,關聯各自紋理單元

一套頂點,但關聯多次紋理單元

這種情況比較容易預見,畢竟最終指定了單一的紋理單元,最後指定的將會繪製出來,這是示例

但如果其中有一張包含透明區域的圖片會如何?這是示例,先使用的是貓圖片紋理,然後使用犬圖片紋理,而且犬圖片背景是透明的,最終還是隻顯示了犬的圖片。

兩套相同位置頂點,關聯各自紋理單元

這是示例,結果只看到最後一套頂點對應的紋理圖片。

針對包含透明區域的圖片示例, 結果也是隻看到最後一套頂點對應的紋理圖片。

小結

由上面的測試推測:預設情況下,相同頂點的紋理圖片不會保留歷史使用的紋理圖片資料。

為了再次證實一下,看下兩個紋理有部分交集的情況示例,發現有交集的地方是犬圖片紋理透明的地方,直接看到了 Canvas 父元素的背景色,也是不會有歷史紋理資料。

參考資料

相關文章