无法从 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 上成功?

谢谢...

Safari 未通过 the WebGL Conformance Test for OES_texture_half_float

提交错误 on their bug tracker