Я пытаюсь преобразовать текстуру DDS (в основном DXT1 и DXT3) в ImageData с использованием WebGL. Вот моя попытка...
let ext = <WEBGL_compressed_texture_s3tc>gl.getExtension('WEBGL_compressed_texture_s3tc');
let texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
let fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.COMPRESSED_RGBA_S3TC_DXT3_EXT, width, height, 0, sourceImage);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
let data = new Uint8Array(width * height * 4);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);
gl.deleteFramebuffer(fb);
let image = new ImageData(new Uint8ClampedArray(data), width, height);
где gl — WebGLRenderingContext, а sourceImage (Uint8Array) — текстура в формате DXT3. Без всяких мипмапов и прочего. Я уверен, потому что я пытался визуализировать эту текстуру с помощью этого фрагмента, и он работал.
Сбой кода в функции readPixels со следующей ошибкой (Google Chrome):
[.Offscreen-For-WebGL-000001F2F3C04690]ОШИБКА GL: GL_INVALID_FRAMEBUFFER_OPERATION: glReadPixels: кадровый буфер неполный
Я ищу ответ, конечно, но безуспешно. Возможно, это может помочь. Я могу предоставить несколько примеров текстур, если они понадобятся.