2017-02-06 63 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