Поддерживаются ли 1D текстуры в WebGL?

Я пытался найти четкий ответ, но, похоже, никто не задал четко вопрос.

Можно ли использовать 1D-образец и 1D-текстуру в WebGL Chrome, Firefox, Safari, IE и т.д.

ИЗМЕНИТЬ

Понятно, что 1 действительно является степенью 2 (2 ^ 0 = 1), что позволяет эффективно использовать 2D-сэмплер и текстуру с использованием высоты 1 и ширины 256 или 512 и т.д. для репликации 1D-текстуры.

1D текстуры не являются спорными, они существуют, потому что они не только имеют цель, но и предназначены для преобразования в оптимизации на самом графическом процессоре (в отличие от 2D-текстуры). Помните, что каждый параметр требует времени для загрузки в стек вызовов, и почти все программирование графического процессора - это искусство оптимизации любой возможной операции.

Вычислить шейдеры часто необходимо для одного списка поплавков без дополнительного измерения, используя 1D текстуру и пробоотборник обеспечивает ту же четкость, что и сильная типизация. Т.е. представляющие 1D данные в 1D-структуре и представляющие 2D-данные в 2D-структуре. Он также удаляет дополнительные операции, требуемые в индексе, для перевода строк/столбцов.

Вопросы не были, если у них есть веская причина, но они еще поддерживаются.

В WebGL 1.0 на основе OpenGL ES 2.0 от 09/MAY/2014

  • В настоящее время нет поддержки 1D текстуры или сэмплера.

Ответ 1

Зачем вам нужны 1D текстуры? Просто сделайте 2D-текстуру N пикселей шириной и высотой 1 пиксель.

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);

// 3x1 pixel 1d texture
var oneDTextureTexels = new Uint8Array([
    255,0,0,255, 
    0,255,0,255,
    0,0,255,255,
]);

var width = 3;
var height = 1;
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE,
              oneDTextureTexels);

Любая генерация или фильтрация, чтобы не было необходимости в mips

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_W, gl.CLAMP_TO_EDGE);

Пример с 0.5 для y

uniform sampler2D u_texture;
varying float v_texcoord;

void main() {
  vec4 color = texture2D(u_texture, vec2(v_texcoord, 0.5));
  ...

Здесь пример с использованием 1D текстур. Он использует точечный продукт типичного вычисления освещения для поиска значения из текстуры рампы 1d для затенения объектов.

В прямом ответе на ваш вопрос. В WebGL не будет 1D текстур, потому что WebGL основан на OpenGL ES 2.0, а OpenGL ES 2.0 не поддерживает 1D-текстуры. Также OpenGL ES 3.0 и 3.1. Я был бы удивлен, если бы они полностью не удаляли 1D-текстуры, когда они объединяли OpenGL и OpenGL ES

Ответ 2

WebGL 1.0 основан на OpenGL ES 2.0, который не поддерживает 1D-текстуры. Раздел Объекты текстуры в спецификации WebGL отражает это только с помощью методов texImage2D и compressedTexImage2D.

Вместо текстуры вы можете использовать текстуру с высотой.

Ответ 3

Как сказал Йенс Нольте, он не поддерживается в WebGL, поскольку он основан на OpenGL ES. Вы можете использовать 2D-текстуры с шириной или высотой единицы. Например (256 ширины и 1 высота):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, ColorMap.optimalIB);

Затем в пробоотборнике вы можете пробовать текстуру, используя любое значение для высоты (поскольку это не имеет значения).