首页 > 解决方案 > 如何在 WebGL2 中创建内部格式为“RG8UI”的纹理?

问题描述

下面的代码片段尝试创建纹理,然后检查gl.getError(). 当内部格式设置为RG8创建成功。我想将内部格式设置为RG8UI,但这会导致创建失败。在 Firefox 中,还会向控制台打印警告:Mismatched internalFormat and format/type: 0x8238 and 0x8227/0x1401where 0x8238=RG8UI0x8227=RG0x1401=UNSIGNED_BYTE.

据我所知,MDN 关于 texImage2D 的文档表明允许将内部格式RG8UI与格式配对,RG尽管它不是“纹理可过滤”的,无论如何这意味着。我在这里做错了什么?

const gl = document.createElement('canvas').getContext('webgl2');
const GL = WebGL2RenderingContext;
const w = 8;
const h = 8;
let texture = gl.createTexture();
gl.bindTexture(GL.TEXTURE_2D, texture);
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST);
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST);
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.texImage2D(GL.TEXTURE_2D, 0, GL.RG8UI, w, h, 0, GL.RG, GL.UNSIGNED_BYTE, null);

if (gl.getError() != GL.NO_ERROR) {
    throw new Error("Failed");
}
console.log("passed");

标签: webgl2

解决方案


如果图像格式是整数格式,那么格式也必须是整数。要么INVALID_OPERATION生成错误。请注意,指定
了允许的internalformatformattype组合:格式、类型和大小的 internalformat 的有效组合。有效的组合是RG8UI, RG_INTEGER, UNSIGNED_BYTE

将格式参数从更改GL.RGGL.RG_INTEGER

gl.texImage2D(GL.TEXTURE_2D, 0, GL.RG8UI, w, h, 0, GL.RG, GL.UNSIGNED_BYTE, null);

gl.texImage2D(GL.TEXTURE_2D, 0, GL.RG8UI, w, h, 0, GL.RG_INTEGER, GL.UNSIGNED_BYTE, null);

推荐阅读