2017-02-06 76 views
1

我正在研究一個WebGL項目,並且所有的紋理渲染都很好。 當我想實現一個立方體貼圖時,我開始出現這種類型的錯誤。 Argument 9 of WebGLRenderingContext.texImage2D does not implement interface ArrayBufferViewOrNull.在所有瀏覽器中。 我使用加載紋理的我的代碼片段是,WebGLRenderingContext.texImage2D沒有實現接口ArrayBufferViewOrNull

var cubeMap = gl.createTexture(); 
    gl.bindTexture(gl.TEXTURE_CUBE_MAP, cubeMap); 

    for(var i = 0; i < 6; i++) 
    { 
     var img = cubeMapArr[i]; 
     console.log(img); 
     gl.texImage2D(
      gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 
      0, gl.RGB, 1024, 1024, 0, gl.RGB, gl.UNSIGNED_BYTE,img); 
    } 

cubeMapArr保持HTMLImageElements。 有關此問題的任何想法或經驗? 使用gl.texImage2D()例如像這樣,

gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,normalMapTexture); 

作品沒有問題。 再次normalMapTexture保存HTMLImageElement。

謝謝。

+0

謝謝編輯genpfault這個問題應該標記爲opengl-es。 –

+2

不,它不應該被標記爲opengl-es,因爲錯誤與opengl-es無關。 OpenGL ES沒有ArrayBufferViews或HTMLImageElements的概念 – gman

回答

2

在WebGL的有2種形式的texImage2D

gl.texImage2D(bindPoint, mipLevel, internalFormat, format, type, HTMLElement); 

其中HTMLElement要麼HTMLImageElementHTMLVideoElementHTMLCanvasElement

,然後有

gl.texImage2D(bindPoint, mipLevel, internalFormat, width, height, border, 
       format, type, ArrayBufferViewOrNull); 

您的代碼傳遞一個HTMLImageElement到第二種形式的功能,這就是爲什麼它抱怨它不是ArrayBufferViewOrNull

換句話說,從你的電話中刪除1024, 1024, 0,gl.texImage2D

在WebGL2您使用存在,但要注意WebGL2剛剛運在2017年一月只有Chrome和Firefox的形式。它在Edge或Safari中尚未提供,包括Safari iOS。

+0

我更新了firefox並使用了webgl2上下文,我認爲它只在Firefox中可用。第二個版本(包含更多參數)'gl.texImage2d'函數在那裏與'HTMLImageElement'一起工作。感謝您的回答,第一個版本較少的參數在webgl1上下文中起作用。 –

+1

WebGL2已經發布在Firefox和Chrome中 – gman