【问题标题】:How to use linear interpolation with a 3D texture when using short integer format?使用短整数格式时如何使用带有 3D 纹理的线性插值?
【发布时间】:2019-05-07 15:13:24
【问题描述】:

我正在使用 3D 纹理并尝试应用线性插值,如下所示:

gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);

失败并出现此错误:

渲染警告:绑定到纹理单元 0 的纹理不可渲染。它可能不是 2 的幂,并且具有不兼容的纹理过滤。

使用 NEAREST 时,相同的代码可以正常工作(只是没有插值)。我对自己错过了什么感到困惑。这种格式组合不支持 LINEAR 吗?如何为此添加线性插值?

片段着色器:

#version 300 es
precision highp float;
precision highp int;
precision highp isampler3D;

uniform isampler3D textureData;

in vec3 v_texcoord;
out vec4 color;

void main()
{
    int raw = texture(textureData, v_texcoord).x;

    if (raw > 0) {
        color = vec4(1.0, 0.0, 0.0, 1.0);
    } else {
        color = vec4(0.0, 0.0, 0.0, 1.0);
    }
}

纹理使用:

const texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_3D, texture);

// LINEAR fails
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);

// NEAREST works
//gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
//gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);

gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

gl.texImage3D(gl.TEXTURE_3D, 0, gl.R16I, x, y, z, 0, gl.RED_INTEGER, 
  gl.SHORT, data);

【问题讨论】:

    标签: javascript opengl-es webgl webgl2


    【解决方案1】:

    GLES 3.0.5 spec(我相信 WebGL2 是基于它的)第 130-132 页的表 3.13 中,您可以看到所有整数纹理格式都没有勾选“Texture-Filterable”。

    我认为问题与使用 3D 纹理无关,而是与 R16I 不支持插值有关。

    根据您要解决的问题,使用 R8 或 R16F 可能会更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2020-04-03
      • 2021-02-06
      • 1970-01-01
      • 2013-05-07
      相关资源
      最近更新 更多