嗨,我有存储在 Uin8Array 中的 jpeg 压缩数据。我在 Webgl 中阅读了有关纹理的信息。我看到的所有链接在加载图像后初始化纹理(由 jpeg 数据创建,image.src = "some data" image.onload (load texture))。但这是异步过程。这个过程工作正常。但是我可以使用函数compressedTexImage2D(target, level, internalFormat, width, height, border, data) 内部格式应该与jpeg相关,数据将采用压缩jpeg格式的形式(宽度或高度不是2的pow形式) 所以整个过程应该是同步的?或者 webgl 中的任何其他方法直接采用 jpeg 压缩数据而不加载图像?
问问题
2091 次
1 回答
2
所以这是一个坏消息,截至 2012 年 9 月,WebGL 实际上并不支持compressedTexImage2D
. 如果您尝试调用该函数,它将始终返回INVALID_ENUM
错误。如果您对此感到好奇,请参阅说明它的规范部分。
现在一些好消息是,您可以从Uint8Array
jpeg 数据创建纹理。我不确定如何同步执行此操作,但也许这段代码无论如何都会有所帮助。
基本上我们必须将原始Uint8Array
数据转换为base64字符串,这样我们就可以创建一个以base64字符串为图像源的新图像。
所以这里是代码:
function createTexture(gl, data) {
var stringData = String.fromCharCode.apply(null, new Uint16Array(data));
var encodedData = window.btoa(stringData);
var dataURI = "data:image/jpeg;base64," + encodedData;
texture = gl.createTexture();
texture.image = new Image();
texture.image.onload = function () {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
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_T, gl.CLAMP_TO_EDGE);
gl.bindTexture(gl.TEXTURE_2D, null);
};
texture.image.src = dataURI;
return texture;
}
我在这里有一个函数的演示。为了保持文件小,我只使用了 24x24 像素的 jpeg。万一您想知道,该功能也适用于非 2 高度/宽度幂的 jpeg。
如果您想查看演示的完整源代码,请查看此处。
于 2012-09-30T01:21:56.700 回答