是否可以在深度纹理上使用 texSubImage2D?

问题描述

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

我的深度纹理是一个普通的 WebGLTexture,如下所示:

gl.texImage2D(gl.TEXTURE_2D,gl.DEPTH_COMPONENT,width,height,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,slot,SHADOW_MAP_WIDTH,1,gl.RGBA,gl.UNSIGNED_BYTE,emptyDepthRow);

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

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

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

解决方法

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

function clearShadowMapSlot(gl,slot,shadowMapWidth) {
  gl.enable(gl.SCISSOR_TEST);

  gl.scissor(0,shadowMapWidth,1);
  gl.clear(gl.DEPTH_BUFFER_BIT);

  gl.disable(gl.SCISSOR_TEST);
}