В настоящее время я следую этому руководству для рендеринга моей сцены в текстуру для создания карты глубины / тени: 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 ++.