我试图让 WebGL2 RGBA16UI 纹理工作,它们似乎工作如我上一个问题的答案所示:如何在 WebGL 中创建 16 位无符号整数/无符号短 2D 纹理
但是,尽管答案中的代码单独有效:
const gl = canvas.getContext('webgl2');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(
gl.TEXTURE_2D,
0,
gl.RGBA16UI,
8,
8,
0,
gl.RGBA_INTEGER,
gl.UNSIGNED_SHORT,
null
);
console.log(gl.getError());
当我尝试添加实际像素时它不起作用。
const gl = canvas.getContext('webgl2');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
let data = new Uint16Array(8 * 8 * 4);
gl.texImage2D(
gl.TEXTURE_2D,
0,
gl.RGBA16UI,
8,
8,
0,
gl.RGBA_INTEGER,
gl.UNSIGNED_SHORT,
data
);
console.log(gl.getError());
即使过度分配,例如此 8x8 纹理的大小为 1000,此代码也不会工作。
我也尝试过使用不同类型的类型化数组,但由于这是使用
gl.UNSIGNED_SHORT
,它在控制台中明确要求我使用 Uint16Array
。
这段代码在 Safari 和 Chrome 上都不起作用,但在 Firefox 上运行良好,尽管它似乎是我正在使用的 WebGL2 中得到良好支持的部分。 https://webgl2fundamentals.org/webgl/lessons/webgl-readpixels.html
我认为这很可能只是这些浏览器上的 WebGL API 之间的差异,但是,我想知道为什么在没有数据的情况下创建纹理时这个问题不是问题,为什么错误消息如此模糊(这只是一个警告,仅在我添加数组数据时产生,并且仅表示格式和类型无效而不是不受支持),我应该使用(推荐)哪些扩展来解决此问题及其级别支持,以及如果我错了如何解决这个问题。
如果你们能够发送一些支持格式的好文档,因为我已经看过了:
似乎表明WebGL2支持这一点
刚刚做了检查,这是我在创建纹理之前使用的库中的一些初始化代码的问题。对于那个很抱歉。即使使用 WebGL2 加载数据,RGBA16UI 纹理现在看起来也能正常工作。