无法从 iPad 上的 Uint16Array 创建 HALF_FLOAT_OES 纹理
Cannot create HALF_FLOAT_OES texture from Uint16Array on iPad
我有一个 iPad Pro 12.9in ML0F2X/A 和 iOS 12.1.1。我正在尝试创建半浮点 WebGL 纹理,从 Uint16Array 初始化:
var halfExt = gl.getExtension("OES_texture_half_float");
...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA,
halfExt.HALF_FLOAT_OES, new Uint16Array([0, 0, 0, 0]));
texImage2D 失败 INVALID_OPERATION。我已经在 iPad 上使用最新的(2019 年 1 月)移动版本的 Safari、Chrome 和 Firefox 进行了测试。在使用远程调试的 Safari 中,我可以看到日志消息:
WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
如果我将 Uint16Array 替换为 null,调用会在 iPad 上成功,但我的纹理当然会丢失。
这是一个片段:
function log(msg) {
var div = document.createElement("div");
div.appendChild(document.createTextNode(msg));
document.body.appendChild(div);
}
function glEnum(gl, v) {
for (var key in gl) {
if (gl[key] === v) {
return key;
}
}
return "0x" + v.toString(16);
}
// Get A WebGL context
var canvas = document.getElementById("c");
var gl = canvas.getContext("webgl");
if (gl) {
function getExt(name) {
var ext = gl.getExtension(name);
log("Extension " + name + " is " + (ext ? "" : "NOT ") + "supported");
return ext;
}
function checkError(test) {
var err = gl.getError();
if (err === 0)
log(test + ": successful");
else
log(test + ": flagged error " + err + " = gl." + glEnum(gl, err));
}
var floatExt = getExt("OES_texture_float");
getExt("OES_texture_float_linear");
if (floatExt) {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.FLOAT, null);
checkError("Create gl.FLOAT texture with NULL buffer");
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.FLOAT, new Float32Array([0, 0, 0, 0]));
checkError("Create gl.FLOAT texture with Float32Array buffer");
}
var halfExt = getExt("OES_texture_half_float");
getExt("OES_texture_half_float_linear");
if (halfExt) {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, halfExt.HALF_FLOAT_OES, null);
checkError("Create halfExt.HALF_FLOAT_OES texture with NULL buffer");
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, halfExt.HALF_FLOAT_OES, new Uint16Array([0, 0, 0, 0]));
checkError("Create halfExt.HALF_FLOAT_OES texture with UInt16Array buffer");
}
}
<canvas id="c" width=100 height=100 style="border:solid black 1px;"></canvas>
在我的 Windows 7 盒子上,在桌面版 Firefox 60.4ESR 和 Chrome 71.0 中,所有测试均成功。在 iPad,只有最后一个失败。我怎样才能使这个调用在 iPad 上成功?
谢谢...
我有一个 iPad Pro 12.9in ML0F2X/A 和 iOS 12.1.1。我正在尝试创建半浮点 WebGL 纹理,从 Uint16Array 初始化:
var halfExt = gl.getExtension("OES_texture_half_float");
...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA,
halfExt.HALF_FLOAT_OES, new Uint16Array([0, 0, 0, 0]));
texImage2D 失败 INVALID_OPERATION。我已经在 iPad 上使用最新的(2019 年 1 月)移动版本的 Safari、Chrome 和 Firefox 进行了测试。在使用远程调试的 Safari 中,我可以看到日志消息:
WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
如果我将 Uint16Array 替换为 null,调用会在 iPad 上成功,但我的纹理当然会丢失。
这是一个片段:
function log(msg) {
var div = document.createElement("div");
div.appendChild(document.createTextNode(msg));
document.body.appendChild(div);
}
function glEnum(gl, v) {
for (var key in gl) {
if (gl[key] === v) {
return key;
}
}
return "0x" + v.toString(16);
}
// Get A WebGL context
var canvas = document.getElementById("c");
var gl = canvas.getContext("webgl");
if (gl) {
function getExt(name) {
var ext = gl.getExtension(name);
log("Extension " + name + " is " + (ext ? "" : "NOT ") + "supported");
return ext;
}
function checkError(test) {
var err = gl.getError();
if (err === 0)
log(test + ": successful");
else
log(test + ": flagged error " + err + " = gl." + glEnum(gl, err));
}
var floatExt = getExt("OES_texture_float");
getExt("OES_texture_float_linear");
if (floatExt) {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.FLOAT, null);
checkError("Create gl.FLOAT texture with NULL buffer");
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.FLOAT, new Float32Array([0, 0, 0, 0]));
checkError("Create gl.FLOAT texture with Float32Array buffer");
}
var halfExt = getExt("OES_texture_half_float");
getExt("OES_texture_half_float_linear");
if (halfExt) {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, halfExt.HALF_FLOAT_OES, null);
checkError("Create halfExt.HALF_FLOAT_OES texture with NULL buffer");
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, halfExt.HALF_FLOAT_OES, new Uint16Array([0, 0, 0, 0]));
checkError("Create halfExt.HALF_FLOAT_OES texture with UInt16Array buffer");
}
}
<canvas id="c" width=100 height=100 style="border:solid black 1px;"></canvas>
在我的 Windows 7 盒子上,在桌面版 Firefox 60.4ESR 和 Chrome 71.0 中,所有测试均成功。在 iPad,只有最后一个失败。我怎样才能使这个调用在 iPad 上成功?
谢谢...