2014-02-22 1 views
8

dartium에서 웹 앱을 실행할 때 [.WebGLRenderingContext]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete' 오류가 발생합니다. 코드를 완전히 다시 작성하는 등 이틀 동안이 문제를 해결하기 위해 노력했지만 문제를 격리 할 수는 없습니다.다트 : web_gl : 렌더링 경고 : 텍스처 단위 0에 바인딩 된 텍스처는 렌더링 할 수 없습니다.

그러나 문제는이 코드 조각에 있다고 생각합니다.

void main() { 
    ... 
    var texture = gl.createTexture(); 
    var image = new ImageElement(); 
    image.onLoad.listen((e) { 
     gl.bindTexture(webGL.TEXTURE_2D, texture); 
     gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
         webGL.UNSIGNED_BYTE, image); 
     gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST); 
     gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST); 
     gl.bindTexture(webGL.TEXTURE_2D, null); 
    }); 
    image.src = "tex.png"; 
    ... 
    } 

tex.png는 32 × 32

문제가 무엇인지에 대한 어떤 아이디어인가?

+0

gl.generateMipmap (gl.TEXTURE_2D); 도와 드릴까요? – Fox32

+1

@ Fox32 그렇지 않습니다. 그리고 밉맵 매개 변수를 설정할 때만 필요하지 않습니까? – lightandlight

답변

12

제 질문의 코드 바로 다음에 텍스처를 바인딩하고 샘플러 유니폼을 보냈습니다. 이것은 이미지가로드되기 전에 실행 되었기 때문에 잘못되었습니다. 이 문제를 해결하기 위해 onload 함수에서 텍스처를 바인딩하고 요소를 그리는 호출을했습니다.

image.onLoad.listen((e) { 
    gl.bindTexture(webGL.TEXTURE_2D, texture); 
    gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
         webGL.UNSIGNED_BYTE, image); 
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST); 
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST); 
    gl.bindTexture(webGL.TEXTURE_2D, null); 

    gl.activeTexture(webGL.TEXTURE0); 
    gl.bindTexture(webGL.TEXTURE_2D, texture); 
    gl.uniform1i(gl.getUniformLocation(shader.program, "uSampler"), 0); 

    gl.drawElements(webGL.TRIANGLES, 6, webGL.UNSIGNED_SHORT, 0); 

    }); 

이미지가로드되었는지 확인합니다.

전에는 onload 콜백을 지정하고 텍스처 바인딩과 관련된 다음 명령 집합을 실행했지만 컴퓨터가 매우 빠르기 때문에 이미 텍스처를 바인딩하고 이미지가 있기 전에 그려야했습니다. 로드를 완료했습니다.

+8

이것을 처리하는 또 다른 방법은 텍스처를 생성 할 때 1x1 픽셀 텍스처를 생성하고 이미지가로드 된 후이를 이미지로 교체하는 것입니다. 이렇게하면 특별한 검사없이 즉시 도면을 시작할 수 있습니다. http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load/19748905#19748905 – gman

+0

이 점을 명심 해 주시기 바랍니다. 감사합니다. – lightandlight

관련 문제