如何向GPU发送float 1组件纹理?

时间:2015-09-25 18:51:51

标签: textures webgl texture2d

在WebGL中,我试图向GPU发送一个float 1组件纹理:

var array = new Float32Array(4096*4096);
// ... read array from file 
var float_texture_ext = gl.getExtension('OES_texture_float');
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
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);
gl.texImage2D(gl.TEXTURE_2D, 0, 4096, 4096, 0, gl.ALPHA, gl.ALPHA, gl.FLOAT, array);

但它不起作用。在我的电脑上的Chrome中,我收到以下警告:

WebGL: INVALID_OPERATION: texImage2D: incompatible format and internalformat
[.WebGLRenderingContext-1A49BCD8]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

我也试过gl.RGBA,gl.RGBA,但结果相同。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您对gl.texImage2D的论点出了问题。这是

 gl.texImage2D(target, level, internalFormat, width, height,
               border, format, type, data);

还应该检查获得浮点扩展的结果,因为大量的手机和平板电脑不支持它们,所以你至少应该告诉用户它不会起作用。

var ext = gl.getExtension("OES_texture_float");
if (!ext) {
   alert("This device does not support floating point textures");
}

而且,如果你想用浮点纹理进行LINEAR过滤,你也需要启用它。

var ext = gl.getExtension("OES_texture_float_linear");
if (!ext) {
   alert("This device can not filter floating point textures");
}

请注意,此时(2015年9月),很少有流行手机支持对浮点纹理进行过滤。