簡體   English   中英

如何獲取 Webgl 紋理的副本

[英]How do I Get Copy of Webgl Texture

我有一個 webgl 紋理,我將此紋理存儲在 javascript 變量中

var texture1 = CreateTexture()

function CreateTexture(){
  var texture = gl.createTexture()
  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false)
  gl.bindTexture(gl.TEXTURE_2D, texture)
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE,canvas)
  gl.generateMipmap(gl.TEXTURE_2D)
  gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
  gl.texParameterf(gl.TEXTURE_2D, this.extAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, 2)
  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true)
  return texture
}

我想將此紋理(texture1)的副本保留在另一個變量中,而不是實例中。 例如對於 javascript arrays,感謝切片 function,我們可以在變量中保留 ZA3CBC3F9D0CE2F2C19CDZ4 的副本。

var arr1 = [1,2,3,4,5]
var arr2 = arr1.slice()

我如何為 webgl 紋理執行此操作?

沒有簡單的方法,也不能保證您可以復制紋理。

要復制紋理,您需要渲染到紋理 所以你設置一個着色器和屬性和制服來繪制源紋理,將目標紋理附加到幀緩沖區,綁定幀緩沖區,繪制。

您也可以使用 copyTexImage2D。 如果沒有綁定幀緩沖區,它會從當前幀緩沖區或 canvas 復制,因此在這種情況下,您獲取源紋理,將其附加到幀緩沖區,綁定幀緩沖區,綁定目標紋理,調用copyTexImage2D

兩種方法的限制是

  1. 並非每種格式的紋理都可以用作幀緩沖區的附件。 例如,在 WebGL1 中,只有格式/類型 RGBA/UNSIGNED_BYTE 的紋理保證能夠附加到幀緩沖區

  2. 您無法在 WebGL1 中查詢紋理的大小,因此您需要自己將其保存在某個地方

  3. 您無法查詢紋理的內部格式或格式或類型,因此您必須保存它。 請注意,在 WebGL2 中,每個 mip 具有與任何其他 mip 無關的大小以及不同的內部格式是合法的,只要設置紋理的基本 LOD 和最大 LOD 以使使用的 mip 范圍有效。 這意味着對於通用副本,您需要保存每個 mip 級別的尺寸和內部格式。

  4. 您無法查詢有多少 mips,因此如果您關心,您需要保存該信息

  5. 即使知道有多少 mips,也不能輕易復制

    對於 1,您不能將除級別 0 之外的 mip 綁定到幀緩沖區。 這意味着第一種方法不適用於復制 mip,因為您無法將 mip 指定為復制的目標。 對於第二種方法,您不能將 mip 指定為副本的源,因此您需要編寫一個着色器,將該 mip 渲染到 canvas 或另一個紋理,然后調用 copyTexImage2D 將其放入 mip。

    如果您不關心 mips 的內容,您可以復制級別 0 並調用generateMipmap

  6. 如果紋理不在可渲染 state 中,則無法復制紋理。

    例如,在 WebGL1 中,具有非 2 次冪的紋理和過濾設置為使用 mips 或重復。 或者如果 mips 的大小不正確或格式不同。

對於像TEXTURE_MIN_FILTERTEXTURE_WRAP_S這樣的參數,您可以調用gl.getTextureParameter從一個紋理中查詢它們並將它們應用到另一個紋理,或者您可以像上面的問題 2 和 3 一樣自己保存它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM