Поддерживаются ли 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);
Затем в пробоотборнике вы можете пробовать текстуру, используя любое значение для высоты (поскольку это не имеет значения).