gpt4 book ai didi

javascript - 如何在 webgl2 中使用深度纹理

转载 作者:行者123 更新时间:2023-12-02 21:27:41 27 4
gpt4 key购买 nike

当您只需要帧的颜色部分时,可以将深度存储在渲染缓冲区中。
这对我来说在 webgl1webgl2 上都工作得很好。

当您还需要使用深度部分时,您无法使用渲染缓冲区,您需要将其存储在纹理中.
webgl1 中,您需要获得一个扩展来支持它。
这对我来说在 webgl1 中也很有效。

    const gl = canvas.getContext('webgl');
const depthTextureExtension = gl.getExtension('WEBGL_depth_texture');
if (!depthTextureExtension) {
alert('Depth textures not supported');
}

默认情况下,webgl2 中应提供此功能。
然而,当我用以下代码替换上面的代码时:

    const gl = canvas.getContext('webgl2');

我的代码无法呈现,而且我找不到任何解释。

    this.texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);


this.depth = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.depth);
checkGLErrors(gl); // OK
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, width, height, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);
checkGLErrors(gl); // for webgl2: 1281 INVALID_VALUE
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);


this.framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.depth, 0);

最佳答案

在 WebGL2 中,DEPTH_COMPONENT 不是有效的内部格式。使用 DEPTH_COMPONENT16DEPTH_COMPONENT24DEPTH_COMPONENT32F

示例 from here

  const level = 0;
const internalFormat = gl.DEPTH_COMPONENT24;
const border = 0;
const format = gl.DEPTH_COMPONENT;
const type = gl.UNSIGNED_INT;
const data = null;
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat,
targetTextureWidth, targetTextureHeight, border,
format, type, data);

关于javascript - 如何在 webgl2 中使用深度纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698023/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com