首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在webgl2中使用深度纹理

如何在webgl2中使用深度纹理
EN

Stack Overflow用户
提问于 2020-03-15 21:51:50
回答 1查看 1.3K关注 0票数 0

当您只需要帧的颜色部分时,可以将深度存储在呈现缓冲区中。

这对我来说在webgl1webgl2上都很好。

当您还需要使用深度部件时,您不能使用呈现缓冲区,需要将其存储在纹理中。

webgl1中,您需要获得一个扩展来支持它。

webgl1中,这对我也很好。

代码语言:javascript
复制
    const gl = canvas.getContext('webgl');
    const depthTextureExtension = gl.getExtension('WEBGL_depth_texture');
    if (!depthTextureExtension) {
        alert('Depth textures not supported');
    }

默认情况下,在webgl2中应该可以使用此特性。

然而,当我将上面的代码替换为:

代码语言:javascript
复制
    const gl = canvas.getContext('webgl2');

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

代码语言:javascript
复制
    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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-16 09:40:54

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

示例从这里开始

代码语言:javascript
复制
  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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60698023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档