为什么我的 gl.generateMipmap 返回 GL_INVALID_OPERATION?
Why is my gl.generateMipmap returning GL_INVALID_OPERATION?
我正在尝试为使用 gl.texStorage2d()
初始化的纹理创建 mipmap,但在调用 gl.generateMipmap( gl.TEXTURE_2D )
时得到 GL_INVALID_OPERATION
。我的测试纹理是 128x128,在没有 mipmap 的情况下也能正常显示。
我可以在不使用 texStorage 的情况下创建 mipmap,但我在某处读到它允许驱动程序更有效地执行。我在带有 NVIDIA GT 750M 的 macOS Sierra 上使用 Chrome 57.0.2987.133。
如何在仍然使用 texStorage 的情况下修复错误?
我还注意到,如果我将 gl.SRGB8_ALPHA8
替换为 gl.RGBA8
,我的代码可以正常运行,但我想使用前者。
function handleLoadedTexture( image )
{
let textTexture = gl.createTexture();
gl.activeTexture( gl.TEXTURE0 );
gl.bindTexture( gl.TEXTURE_2D, textTexture );
gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, true );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_BASE_LEVEL, 0 );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAX_LEVEL, Math.log2( image.width ) );
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.texStorage2D( gl.TEXTURE_2D, Math.log2( image.width ), gl.SRGB8_ALPHA8, image.width, image.height );
gl.texSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, image );
gl.generateMipmap( gl.TEXTURE_2D );
这似乎是 Chrome 或 WebGL2 规范中的错误。
Chrome 生成 WebGL 错误。
[.Offscreen-For-WebGL-0x7fee3e069600]GL ERROR :GL_INVALID_OPERATION : glGenerateMipmap:
Firefox 在 Web 控制台中打印错误但不生成 WebGL 错误
Error: WebGL: texSubImage2D: Conversion requires pixel reformatting.
Firefox 的错误实际上可能只是速度警告,但不清楚。
即使在没有 gl.texStorage2D
的情况下尝试,同样的事情也会发生。
const gl = document.createElement("canvas").getContext("webgl2");
const canvas = document.createElement("canvas");
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texStorage2D( gl.TEXTURE_2D, Math.log2( canvas.width ), gl.SRGB8_ALPHA8, canvas.width, canvas.height );
gl.texSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
gl.generateMipmap(gl.TEXTURE_2D);
log("should be no error was:", getGLErrorString(gl.getError()));
const tex2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex2);
gl.texImage2D( gl.TEXTURE_2D, 0, gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, canvas );
gl.generateMipmap(gl.TEXTURE_2D);
log("should be no error was:", getGLErrorString(gl.getError()));
function getGLErrorString(v) {
if (v === 0) {
return "NO_ERROR";
}
for (key in gl) {
if (gl[key] === v) {
return key;
}
}
return "0x" + key.toString(16);
}
function log(...args) {
const elem = document.createElement("pre");
elem.textContent = [...args].join(' ');
document.body.appendChild(elem);
}
我正在尝试为使用 gl.texStorage2d()
初始化的纹理创建 mipmap,但在调用 gl.generateMipmap( gl.TEXTURE_2D )
时得到 GL_INVALID_OPERATION
。我的测试纹理是 128x128,在没有 mipmap 的情况下也能正常显示。
我可以在不使用 texStorage 的情况下创建 mipmap,但我在某处读到它允许驱动程序更有效地执行。我在带有 NVIDIA GT 750M 的 macOS Sierra 上使用 Chrome 57.0.2987.133。
如何在仍然使用 texStorage 的情况下修复错误?
我还注意到,如果我将 gl.SRGB8_ALPHA8
替换为 gl.RGBA8
,我的代码可以正常运行,但我想使用前者。
function handleLoadedTexture( image )
{
let textTexture = gl.createTexture();
gl.activeTexture( gl.TEXTURE0 );
gl.bindTexture( gl.TEXTURE_2D, textTexture );
gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, true );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_BASE_LEVEL, 0 );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAX_LEVEL, Math.log2( image.width ) );
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.texStorage2D( gl.TEXTURE_2D, Math.log2( image.width ), gl.SRGB8_ALPHA8, image.width, image.height );
gl.texSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, image );
gl.generateMipmap( gl.TEXTURE_2D );
这似乎是 Chrome 或 WebGL2 规范中的错误。
Chrome 生成 WebGL 错误。
[.Offscreen-For-WebGL-0x7fee3e069600]GL ERROR :GL_INVALID_OPERATION : glGenerateMipmap:
Firefox 在 Web 控制台中打印错误但不生成 WebGL 错误
Error: WebGL: texSubImage2D: Conversion requires pixel reformatting.
Firefox 的错误实际上可能只是速度警告,但不清楚。
即使在没有 gl.texStorage2D
的情况下尝试,同样的事情也会发生。
const gl = document.createElement("canvas").getContext("webgl2");
const canvas = document.createElement("canvas");
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texStorage2D( gl.TEXTURE_2D, Math.log2( canvas.width ), gl.SRGB8_ALPHA8, canvas.width, canvas.height );
gl.texSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
gl.generateMipmap(gl.TEXTURE_2D);
log("should be no error was:", getGLErrorString(gl.getError()));
const tex2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex2);
gl.texImage2D( gl.TEXTURE_2D, 0, gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, canvas );
gl.generateMipmap(gl.TEXTURE_2D);
log("should be no error was:", getGLErrorString(gl.getError()));
function getGLErrorString(v) {
if (v === 0) {
return "NO_ERROR";
}
for (key in gl) {
if (gl[key] === v) {
return key;
}
}
return "0x" + key.toString(16);
}
function log(...args) {
const elem = document.createElement("pre");
elem.textContent = [...args].join(' ');
document.body.appendChild(elem);
}