WebGL - INVALID_OPERATION: texImage2D: ArrayBufferView недостаточно велик для запроса - PullRequest
0 голосов
/ 20 января 2019

В настоящее время я следую этому руководству для рендеринга моей сцены в текстуру для создания карты глубины / тени: http://www.opengl -tutorial.org / промежуточные-уроки / tutorial-14-render-to-texture /

Руководство написано на C ++. Я конвертирую его в WebGL - JavaScript и до сих пор был успешным, но, к сожалению, столкнулся с этой ошибкой в ​​Chrome:

WebGL: INVALID_OPERATION: texImage2D: ArrayBufferView недостаточно велик для запроса

Это ошибка, относящаяся к:

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 1024, 768, 0, gl.RGB, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));

Если для ширины и высоты от 1024 до 768 задано значение 1, ошибка не выдается.

В руководстве используется следующее:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

Здесь можно найти отличный ответ на подобный вопрос: Ошибка при создании текстур в WebGL с форматом RGB , из-за чего я полагаю, что поскольку текстура не существует во время вызова метода , он не может быть больше, чем 1 пиксель, но я не уверен, что это правильно? РЕДАКТИРОВАТЬ: Не дубликат этого вопроса по 2 причинам. 1, я бы не задавал этот вопрос, если бы он был дубликатом, и 2, ответ объясняет, почему он не является дубликатом.

Остальная часть преобразованного кода из руководства, которое я дам ниже:

    // shadow test
    this.frameBuffer = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer);

    this.texture = gl.createTexture();
    gl.bindTexture(gl.TEXTURE_2D, this.texture);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 1024, 768, 0, gl.RGB, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);

    this.depthBuffer = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthBuffer);
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 1024, 768);
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depthBuffer);

    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);
    gl.drawBuffers([gl.NONE, gl.COLOR_ATTACHMENT0_EXT]);

    gl.bindFramebuffer(gl.FRAMEBUFFER, this.buffer);
    gl.viewport(0, 0, 1024, 768);

Я пометил это с помощью C ++ и OpenGL, чтобы помочь разобраться в различиях этого метода между WebGL - JavaScript и OpenGL - C ++.

1 Ответ

0 голосов
/ 20 января 2019

Ошибка, которую вы получаете, не имеет ничего общего с выравниванием распаковки, а с тем фактом, что вы просто не можете заполнить текстуру 1024x768 всего 4 байтами.texImage2D требует, чтобы вы либо предоставили null (в этом случае буфер размером текстуры инициализируется, заполняется нулями и используется для инициализации текстуры), либо буфер размером текстуры, который в вашем случае будет 1024 * 768 * 3 байтов, которые по совпадению кратны 4 (поэтому вы не столкнетесь с какими-либо проблемами при распаковке).

Вот соответствующий отрывок спецификации WebGL 1 :

Если пиксели равны нулю, передается буфер достаточного размера, инициализированный равным 0.[...] Если пиксели ненулевые, но их размер меньше, чем требуется для указанных параметров ширины, высоты, формата, типа и хранения пикселей, генерируется ошибка INVALID_OPERATION.

...