2017-04-16 46 views
0

我正在尝试为gl.texStorage2d()初始化纹理创建mipmap,但在拨打gl.generateMipmap(gl.TEXTURE_2D)时我得到GL_INVALID_OPERATION。我的测试纹理是128x128,并且显示正常而没有mipmap。为什么我的gl.generateMipmap返回GL_INVALID_OPERATION?

我可以在不使用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); 

回答

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

+0

火狐错误让我试试'gl.RGBA8'代替gl.SRGB8_ALPHA8'的'和它的作品。让我们希望他们修复这个错误,并感谢您编写WebGL2基础! – SurvivalMachine

+0

Firefox中的错误/警告消失在Firefox Nightly 55.0a1(2017-04-16)(64位) – gman