当前位置: 首页 > Web前端 > HTML5

WebGL2系列不可变纹理

时间:2023-04-05 11:14:18 HTML5

纹理背景知识在WebGL1中,纹理包括2D纹理和立方体纹理。在实际使用中,如果纹理图像的宽和高是2的次方,就可以自动生成纹理的mipmap。另外,可以通过gl.texImage2D函数独立指定纹理的每个mipmap的层级。所以,这就会导致一个普通程序员意识不到的问题,这就涉及到显卡的底层驱动。简单来说,驱动程序在绘制之前无法确定纹理是否已完全指定,因此它必须检查每个mipmap级别或子图像的格式是否相同,每个级别的大小是否正确,是否有足够的内存.这种绘制时检查可能很昂贵,使用不可变纹理可以避免这种情况。不可变纹理使用不可变纹理减少了上述检查的性能开销。不可变纹理是指一种分配纹理的方式,而不是值纹理的内容。不可变纹理的思想是:在加载纹理数据到纹理之前,首先指定纹理的格式和大小。显卡驱动可以提前检查一致性和显存。一旦指定了纹理的格式和大小,纹理的格式和大小就不能再改变了,但是可以通过gl.texSubImage2D、texSubImage3D等方法加载纹理数据(注意不能使用gl.txtImage2D),纹理数据也可以通过render-to-texture,mipmapgeneration等方式加载。texSubImage3D(以及后面提到的texStorage3D)方法与3D纹理相关,后续相关文章会介绍。创建不可变纹理创建不可变纹理非常简单。首先通过gl.bindTexture方法绑定纹理对象,然后调用gl.texStorage2D和texStorage3D创建一个不可变的存储空间,指定纹理的大小和格式。代码如下://--为纹理分配存储空间gl.texStorage2D(gl.TEXTURE_2D,1,gl.RGB8,512,512);gl.texSubImage2D(gl.TEXTURE_2D,0,0,0,gl.RGB,gl.UNSIGNED_BYTE,图像);gl.generateMipmap(gl.TEXTURE_2D);不可变纹理可以优化性能在很多情况下,我们的纹理的大小和数据格式不需要改变。使用不可变纹理可以避免驱动程序检查这些不需要更改大小和数据格式的纹理对象的一致性和内存大小,因此可以获得更好的性能。案例:使用不可变纹理没有后记。本节仅描述2D不可变纹理。3D不可变纹理类似,在使用3D纹理时会进一步说明。