【问题标题】:Is it possible to use texSubImage2D on a depth texture?是否可以在深度纹理上使用 texSubImage2D?
【发布时间】:2021-08-10 12:34:44
【问题描述】:

我正在关注this tutorial 的 2D 阴影映射,并且我已经在 WebGL 中使用它。现在,我正在寻找一种方法来重新计算深度纹理中的单行,而无需清除整个纹理并重新计算每个灯光的值。

我的深度纹理是这样的常规WebGLTexture:

gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, width, height, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);

为此,我想到了做这样的事情:

let SHADOW_MAP_WIDTH = 360;

let emptyDepthValues = new Array(SHADOW_MAP_WIDTH * 4).fill(255);
let emptyDepthRow = new Uint8Array(emptyDepthValues);

// down further..

gl.bindTexture(gl.TEXTURE_2D, this.shadowMapFramebuffer.depthTexture);
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, slot, SHADOW_MAP_WIDTH, 1, gl.RGBA, gl.UNSIGNED_BYTE, emptyDepthRow);

this.shadowMapper.computeRow(vertices, lightPosition, lightSlot, lightRadius);

不幸的是,它似乎不起作用。我知道这一点,因为如果我将调用 bindTexture 和 texSubImage2D 移动到 computeRow 函数之后,这些值仍然存在。也就是说,它们不会通过调用texSubImage2D 重置为默认值。

我目前正在使用 WebGL 1(带有深度纹理扩展),如果可能的话,我希望继续这样做。我正在寻找的只是将WebGLTexture 中的一行重置为其默认值的简单方法。

【问题讨论】:

    标签: javascript webgl textures framebuffer depth-buffer


    【解决方案1】:

    啊,我有个更好的主意。由于我只需要重置特定行的深度值,因此我可以编写一个这样的函数,效果很好:

    function clearShadowMapSlot(gl, slot, shadowMapWidth) {
      gl.enable(gl.SCISSOR_TEST);
    
      gl.scissor(0, slot, shadowMapWidth, 1);
      gl.clear(gl.DEPTH_BUFFER_BIT);
    
      gl.disable(gl.SCISSOR_TEST);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多