2017-04-16 65 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