摘要:除此之外,还可以通过函数独立指定纹理的每个的级别。这种绘图时检查可能代价很高,而使用不可变纹理可以避免这种情形。不可变纹理使用不可变纹理,可以减少上文中提到的因检查而导致的性能开销。不可变纹理指的是纹理的一种分配方式,而不是值纹理的内容。
纹理背景知识
在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纹理的时候会进一步讲述。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92612.html
摘要:在很久很久以前,使用的时候,只能在默认的绘制的缓冲区上面使用,而不能在帧缓冲区上面实现,更加形象的说就是不能用于离屏渲染。下面是该函数的签名该函数的作用就是,把一个帧缓冲区上的指定区域像素转移给另外一个帧缓冲区上的指定区域。 在很久很久以前,盘古开辟了天地,他的头顶着天,脚踩着地,最后他挂了。他的毛发变成了森林,他的血液变成了河流,他的肌肉变成了大地。。。。。。卡! 哦,不对,在很久很...
阅读 3132·2021-09-23 11:55
阅读 2446·2021-09-13 10:33
阅读 1625·2019-08-30 15:54
阅读 3059·2019-08-30 15:54
阅读 2323·2019-08-30 10:59
阅读 2336·2019-08-29 17:08
阅读 1757·2019-08-29 13:16
阅读 3495·2019-08-26 12:25