为什么我的gl.generateMipmap返回GL_INVALID_OPERATION?

时间:2017-04-16 17:23:56

标签: webgl2

我正在尝试为使用gl.texStorage2d()初始化的纹理创建mipmap,但是在调用GL_INVALID_OPERATION时我得到gl.generateMipmap( gl.TEXTURE_2D )。我的测试纹理是128x128,显示没有mipmap。

我可以在不使用texStorage的情况下创建mipmap,但我在某处读到它可以让驱动程序更有效地执行。我在macOS Sierra上使用Chrome 57.0.2987.133和NVIDIA GT 750M。

如何在仍使用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 );

1 个答案:

答案 0 :(得分:0)

这似乎是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);
}




Filed a bug