使用短整数格式时如何使用具有 3D 纹理的线性插值?
How to use linear interpolation with a 3D texture when using short integer format?
我正在使用 3D 纹理并尝试应用线性插值,如下所示:
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
失败并出现此错误:
RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.
相同的代码在使用 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);
在 GLES 3.0.5 spec 的第 130-132 页的 Table 3.13(我相信 WebGL2 是基于它的)中,您可以看到 none 的整数纹理格式具有 'Texture-Filterable'勾选。
我认为这个问题与使用3D贴图无关,而是与R16I不支持插值有关。
根据您要解决的问题,您最好使用 R8 或 R16F
我正在使用 3D 纹理并尝试应用线性插值,如下所示:
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
失败并出现此错误:
RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.
相同的代码在使用 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);
在 GLES 3.0.5 spec 的第 130-132 页的 Table 3.13(我相信 WebGL2 是基于它的)中,您可以看到 none 的整数纹理格式具有 'Texture-Filterable'勾选。
我认为这个问题与使用3D贴图无关,而是与R16I不支持插值有关。
根据您要解决的问题,您最好使用 R8 或 R16F