2015-09-25 6 views
0

В WebGL Я пытаюсь отправить компонент текстуры с плавающей точкой 1 на GPU:Как отправить текстуру компонента float 1 на GPU?

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 но получили тот же результат.

Как это сделать?

ответ

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 г.) несколько популярных телефонов поддерживают фильтрацию текстур с плавающей запятой.

+0

Благодарим вас за предложения gman. Однако я включаю расширения с плавающей запятой (см. 3-я строка). Я также проверил возвращаемое значение, и оно не равно нулю. Также у меня есть этот код для работы с линейной фильтрацией для gl.UNSIGNED_INT, но я попробую включить его в любом случае. – Andy

+0

Извините, я не обращал внимания. Обновлен ответ – gman