Как использовать линейную интерполяцию с 3D-текстурой при использовании короткого целочисленного формата? - PullRequest
0 голосов
/ 07 мая 2019

Я использую 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);

1 Ответ

0 голосов
/ 07 мая 2019

В Таблице 3.13 на странице 130-132 спецификации GLES 3.0.5 (на которой, я полагаю, основан WebGL2), вы можете видеть, что ни один из целочисленных форматов текстур не имеет 'Texture-Filterable' тикали.

Я думаю, что проблема не связана с использованием 3D-текстур, но вместо этого связана с R16I, не поддерживающим интерполяцию.

В зависимости от проблемы, которую вы пытаетесь решить, вам лучше использовать R8 или R16F

...