我有两个使用不同顶点阵列和不同均匀值的着色器,但它们使用相同的纹理(spritesheet / atlas)。是否有可能共享相同的纹理(不会导致纹理被发送到gpu两次)?
背景: 我的游戏在我的笔记本电脑上有一些严重的性能问题,它们似乎与gpu有关。我当前的实现使用两个画布,一个用于我的背景,一个用于我的前景。然后他们为最终图像编写(绘制到第三个画布上)。我的背景使用4个纹理,而我的前景有一个大的spritesheet。前景和后台只使用一次绘制调用。
我希望通过将所有纹理绘制到一个画布上并将所有纹理组合到一个spritesheet中来提高性能。它绝对可能会导致没有改善。我的背景使用噪声来混合纹理,并且很可能主要问题是着色器的复杂性。
答案 0 :(得分:6)
他们可以共享相同的纹理(不会导致纹理被发送到gpu两次
是
当您拨打gl.texImage2D
或gl.texSubImage2D
时,纹理仅会发送到GPU。
设置WebGL程序的最常见形式是
在初始时
在渲染时间
对于纹理,“在初始时间部分”通常意味着调用
gl.createTexture // to create a teture
gl.bindTexture // to assign the texture so follow commands will affect it.
gl.texImage2D // to upload data
gl.texParameteri // to set filtering
gl.generateMipmap // if you need mips
在运行时
gl.activeTexture // to choose a texture unit
gl.bindTexture // to assign an existing texture to the active texture unit
gl.uniform1i // to tell the shader which unit to use for a specific sampler
至于将纹理梳理到纹理图集中,是的,这可能会使您的程序运行得更快。这不是因为你上传的纹理较少,因为你可以用较少的绘制调用绘制更多的东西。 See the cube example near the bottom of this article