javascript - 如何在保留内容的情况下调整 WebGLTexture 的大小?

标签 javascript webgl

我想调整通过与 Framebuffer 上一帧绑定(bind)渲染的 WebGLTexture 的大小。

我尝试使用 texImage2D 调整该纹理的大小,并保持新的大小并保留格式和类型。

我知道这行不通。这可能会生成新的纹理,其尺寸用 [0,0,0,0] 清除整个像素。

如何在保留内容的情况下调整 WebGLTexture 的大小?

最佳答案

您无法在 WebGL 中调整纹理大小而不丢失其内容。您需要分配另一个具有所需大小的纹理并将旧纹理的数据复制到其中。有两种方法可以做到这一点:通过 copyTexSubImage2D 调用或通过绘制调用。请注意,第一种方法需要将旧纹理链接到帧缓冲区,第二种方法需要将新纹理链接到。

假设您的 WebGL 上下文是 gl,旧纹理是 oldTexture,它链接到的帧缓冲区是 oldFramebuffer,新纹理是 newTexture 其帧缓冲区为 newFramebuffer

使用copyTexSubImage2D你可以做这样的事情:

gl.bindFramebuffer(gl.FRAMEBUFFER, oldFramebuffer);
gl.bindTexture(gl.TEXTURE_2D, oldTexture);
gl.copyTexSubImage2D(
    gl.TEXTTURE_2D,
    0,
    offsetInNewTextureX,
    offsetInNewTextureY,
    offsetInOldTextureX,
    offsetInOldTextureY,
    width,
    height
);

完成了!请注意,此方法不允许您操作纹理数据,而只能将其逐像素复制。

第二种方法有点复杂,需要一些着色器,我不会在这里列出。基本上,您需要设置上下文来绘制带纹理的四边形。

gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, oldTexture);
gl.uniform1i(shaderTextureUniformLocation, 0);

gl.bindFramebuffer(gl.FRAMEBUFFER, newFramebuffer);
gl.drawArrays(/* ... */); // Draw the quad.

这样您还可以操作复制的数据,即拉伸(stretch)它。

I tried to resize this texture using texImage2D with new size and keeping formats and type.

I know this wont work. This maybe generate new texture with the size cleared with [0,0,0,0] for entire pixels.

是的,你就在这里。

关于javascript - 如何在保留内容的情况下调整 WebGLTexture 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46540926/

相关文章:

javascript - MobX - 替换可观察数组中的项目?

javascript - 如何在浏览器中使用require

javascript - Three.js 检测 webgl 支持并回退到常规 Canvas

javascript - webgl 2d 将两个透明纹理相互叠加

javascript - 如何使用 jQuery 选择每个组中的第一个元素?

javascript - javascript 缓存的最佳实践,何时使用 var,何时不使用?

javascript - 如何获取多选项下拉列表的值?

javascript - 如何为 WebGL 正确解析 collada 文件? (包括示例)

android - 在原生 Android 应用程序中使用 WebGL

javascript - WebGL 中的时空立方体