[英]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
。
兩種方法的限制是
並非每種格式的紋理都可以用作幀緩沖區的附件。 例如,在 WebGL1 中,只有格式/類型 RGBA/UNSIGNED_BYTE 的紋理保證能夠附加到幀緩沖區
您無法在 WebGL1 中查詢紋理的大小,因此您需要自己將其保存在某個地方
您無法查詢紋理的內部格式或格式或類型,因此您必須保存它。 請注意,在 WebGL2 中,每個 mip 具有與任何其他 mip 無關的大小以及不同的內部格式是合法的,只要設置紋理的基本 LOD 和最大 LOD 以使使用的 mip 范圍有效。 這意味着對於通用副本,您需要保存每個 mip 級別的尺寸和內部格式。
您無法查詢有多少 mips,因此如果您關心,您需要保存該信息
即使知道有多少 mips,也不能輕易復制
對於 1,您不能將除級別 0 之外的 mip 綁定到幀緩沖區。 這意味着第一種方法不適用於復制 mip,因為您無法將 mip 指定為復制的目標。 對於第二種方法,您不能將 mip 指定為副本的源,因此您需要編寫一個着色器,將該 mip 渲染到 canvas 或另一個紋理,然后調用 copyTexImage2D 將其放入 mip。
如果您不關心 mips 的內容,您可以復制級別 0 並調用generateMipmap
如果紋理不在可渲染 state 中,則無法復制紋理。
例如,在 WebGL1 中,具有非 2 次冪的紋理和過濾設置為使用 mips 或重復。 或者如果 mips 的大小不正確或格式不同。
對於像TEXTURE_MIN_FILTER
和TEXTURE_WRAP_S
這樣的參數,您可以調用gl.getTextureParameter
從一個紋理中查詢它們並將它們應用到另一個紋理,或者您可以像上面的問題 2 和 3 一樣自己保存它們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.