2016-03-19 2 views
1

Насколько я знаю, в качестве текстуры в WebGL можно использовать Uint8Array. Но как можно эффективно передать крупный Float32Array или Float64Array в шейдер? Значения поплавка не находятся в диапазоне (0.0, 1.0) и могут быть отрицательными.Как обрабатывать Float32Array в шейдере? (WebGL)

Я знаю, некоторые устройства не поддерживают high precision float, и это не проблема, если какая-то точность теряется во время процесса.

+0

[OES_texture_float] (https://www.khronos.org/registry/webgl/extensions/OES_texture_float/)? –

ответ

2

Попробуйте включить с плавающей точкой текстуры с кодом, как

var ext = gl.getExtension("OES_texture_float"); 
if (!ext) { 
    alert("sorry, no floating point textures"); 
    return; 
} 

Теперь вы можете создавать текстуры с Float32Array использованием

gl.texImage2D(target, level, format, width, height, 0, 
       format, gl.FLOAT, someFloat32Array); 

Обратите внимание, что возможность фильтрации текстур с плавающей точкой является отдельным продолжением так если вам необходимо отфильтровать, вам также нужно будет это проверить

var ext = gl.getExtension("OES_texture_float_linear"); 
if (!ext) { 
    alert("sorry, can't filter floating point textures"); 
    return; 
} 

В противном случае вам необходимо настроить фильтрацию текстур на NEAREST

Смежные вопросы