已记录 WebGL 'texture not renderable' 警告,但所有行为均正确
WebGL 'texture not renderable' warning logged, but all behaviour correct
我正在编写 WebGL 应用程序。一切都按预期工作,除了我在调试控制台中收到以下错误。
[.WebGLRenderingContext-0086F710]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.
让我们排除一些可能性
1- 这肯定不是纹理加载的问题,因为纹理在第一帧中正确显示。
2- 我知道使用二次方纹理,这就是我所做的。直到我真正有相关的纹理,我使用下面的填充纹理,除了放大的,使用的是2x2。
2a- 我知道警告所指的 incompatible texture filtering
是与非二次方纹理一起使用的,但无论如何这里是相关的过滤代码。
// When creating the texture
var texture = gl.createTexture();
texture.image = new Image();
texture.image.onload = function() {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
texture.image.src = src;
// At render time
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, item.texture);
gl.uniform1i(gl.getUniformLocation(shaderProgram, "uSampler"), 0);
我是否正确地假设此错误发生原因的猜测是错误的?什么能满足(而不只是压制)它?
提前致谢。
您是否在纹理加载完成之前进行渲染?这是该错误的常见来源。我的解决方案是在创建时为每个纹理创建一个 1x1 像素的纹理,然后在加载纹理时更新它。
添加这些行
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA,
gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));
另一件要检查的事情是所有制服如果未初始化则默认为零,这意味着所有采样器都指向纹理单元 0。
我正在编写 WebGL 应用程序。一切都按预期工作,除了我在调试控制台中收到以下错误。
[.WebGLRenderingContext-0086F710]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.
让我们排除一些可能性
1- 这肯定不是纹理加载的问题,因为纹理在第一帧中正确显示。
2- 我知道使用二次方纹理,这就是我所做的。直到我真正有相关的纹理,我使用下面的填充纹理,除了放大的,使用的是2x2。
2a- 我知道警告所指的 incompatible texture filtering
是与非二次方纹理一起使用的,但无论如何这里是相关的过滤代码。
// When creating the texture
var texture = gl.createTexture();
texture.image = new Image();
texture.image.onload = function() {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
texture.image.src = src;
// At render time
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, item.texture);
gl.uniform1i(gl.getUniformLocation(shaderProgram, "uSampler"), 0);
我是否正确地假设此错误发生原因的猜测是错误的?什么能满足(而不只是压制)它?
提前致谢。
您是否在纹理加载完成之前进行渲染?这是该错误的常见来源。我的解决方案是在创建时为每个纹理创建一个 1x1 像素的纹理,然后在加载纹理时更新它。
添加这些行
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA,
gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));
另一件要检查的事情是所有制服如果未初始化则默认为零,这意味着所有采样器都指向纹理单元 0。