当我在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'
。我一直在尝试解决这个问题两天,包括完全重写代码,但我无法隔离这个问题。
我认为问题在于这段代码。
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是32x32
关于问题是什么的任何想法?
答案 0 :(得分: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回调,然后执行下一组命令 - 其中涉及绑定纹理 - 但由于计算机非常快,它已经绑定纹理并试图在图像完成之前绘制它负荷。
答案 1 :(得分:2)
我有同样的错误。但就我而言,我忘记设置
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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
在我的 initTexture()
方法中。无论视频大小如何,该代码都有助于正确渲染纹理。
也许它对某人有帮助:)