WebGL2系列之不可变纹理

纹理背景学问

在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纹理的时刻会进一步报告。

    原文作者:netcy
    原文地址: https://segmentfault.com/a/1190000012916308
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞