摘要:除此之外,還可以通過函數獨立指定紋理的每個的級別。這種繪圖時檢查可能代價很高,而使用不可變紋理可以避免這種情形。不可變紋理使用不可變紋理,可以減少上文中提到的因檢查而導致的性能開銷。不可變紋理指的是紋理的一種分配方式,而不是值紋理的內容。
紋理背景知識
在WebGL1中,紋理包括2D紋理和立方體紋理,在實際的使用中,如果紋理的圖片是寬和高是2的冪,可以自動生成紋理的mipmap。
除此之外,還可以通過gl.texImage2D函數獨立指定紋理的每個mipmap的級別。
因此,這會導致一個一般的編程人員不易覺察的問題,這涉及到顯卡底層驅動。
簡單來說,就是會導致驅動程序無法在繪圖之前確定紋理是否完全指定,因此它必須檢查每一個mip貼圖級別或者子圖像的格式是否相符、每一個級別的大小是否正確以及是否有足夠的內存。這種繪圖時檢查可能代價很高,而使用不可變紋理可以避免這種情形。
使用不可變紋理,可以減少上文中提到的因檢查而導致的性能開銷。 不可變紋理指的是紋理的一種分配方式,而不是值紋理的內容。
不可變紋理的思路是:在給紋理加載紋理數據之前,先指定紋理的格式和大小,顯卡驅動程序可以提前進行一致性、內存的檢查,一旦指定了紋理的格式和大小之后,紋理的格式和尺寸就不能更改,但是可以通過gl.texSubImage2D、texSubImage3D(注意不能用gl.txtImage2D)等方法來加載紋理的數據,同時還可以使用such as render-to-texture, mipmap generation等方式加載紋理數據。
texSubImage3D(以及后面提到的texStorage3D)方法與3D紋理有關,后續相關文章會介紹。創建不可變紋理
創建不可變紋理很簡單,首先通過gl.bindTexture方法綁定紋理對象,然后通過調用gl. texStorage2D、texStorage3D指定紋理的大小和格式,來創建不可變的存儲空間。代碼如下:
// -- Allocate storage for the texture gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGB8, 512, 512); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGB, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D);不可變紋理可以優化性能
在很多情況下,我們的紋理的尺寸和數據格式都是不需要改變的。使用不可變紋理,可以避免驅動程序對這些不需要改變的尺寸和數據格式的紋理對象進行一致性和內存大小的檢查,因此可以獲得更佳的性能。
案例:使用不可變紋理暫無
后記本節只講述了2D的不可變紋理,3D的不可變紋理類似,在將3D紋理的時候會進一步講述。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92612.html
摘要:在很久很久以前,使用的時候,只能在默認的繪制的緩沖區上面使用,而不能在幀緩沖區上面實現,更加形象的說就是不能用于離屏渲染。下面是該函數的簽名該函數的作用就是,把一個幀緩沖區上的指定區域像素轉移給另外一個幀緩沖區上的指定區域。 在很久很久以前,盤古開辟了天地,他的頭頂著天,腳踩著地,最后他掛了。他的毛發變成了森林,他的血液變成了河流,他的肌肉變成了大地。。。。。。卡! 哦,不對,在很久很...
閱讀 3255·2021-09-23 11:55
閱讀 2587·2021-09-13 10:33
閱讀 1656·2019-08-30 15:54
閱讀 3085·2019-08-30 15:54
閱讀 2357·2019-08-30 10:59
閱讀 2361·2019-08-29 17:08
閱讀 1793·2019-08-29 13:16
閱讀 3582·2019-08-26 12:25