2017-09-17 3 views
0

J'essaie d'obtenir des textures à virgule flottante dans WebGL2. Je textures initialise comme ceci:Filtrage linéaire des textures à virgule flottante dans WebGL2

function textureFromFloat32Array(gl, arr, w, h){ 
    //https://developer.mozilla.org/en-US/docs/Web/API/OES_texture_float_linear 
    gl.getExtension('OES_texture_float');  // just in case 
    gl.getExtension('OES_texture_float_linear'); // do I need this with WebGL2 
    const texture = gl.createTexture(); 
    gl.bindTexture(gl.TEXTURE_2D, texture); 
    // see https://www.khronos.org/registry/webgl/specs/latest/2.0/#TEXTURE_TYPES_FORMATS_FROM_DOM_ELEMENTS_TABLE 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, w, h, 0, gl.RED, gl.FLOAT, arr); 
    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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); // this works 
    //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
    return texture; 
} 

Dans Firefox 55.0.2 (64 bits), il me donne l'erreur suivante:

Error: WebGL warning: drawElements: Active texture 0 for target 0x0de1 is 'incomplete', and will be rendered as RGBA(0,0,0,1), as per the GLES 2.0.24 $3.8.2: Because minification or magnification filtering is not NEAREST or NEAREST_MIPMAP_NEAREST, and the texture's format must be "texture-filterable".

Avec gl.NEAREST cela fonctionne, mais je dois interpolation linéaire.

Dans Chorme 60.0.3112.101 cela fonctionne avec gl.getExtension('OES_texture_float_linear'); mais je suppose que lorsque j'utilise WebGL2 je ne devrais pas en avoir besoin.

Répondre

0

Même WebGL2 nécessite OES_texture_float_linear. WebGL2 prend en charge les textures à virgule flottante par défaut, mais il ne prend pas en charge leur filtrage ou leur rendu par défaut. Les deux sont des extensions. Voir le tables on this page pour lequel les formats de texture sont supportés et si vous pouvez les filtrer ou les rendre.

La plupart des téléphones mobiles ne prennent pas en charge le filtrage des textures à virgule flottante et ne prennent pas en charge le rendu des textures à virgule flottante. Au moins à compter de septembre 2017.

Pour pouvoir filtrer les textures à virgule flottante, vous devez vérifier et activer OES_texture_float_linear. Pour être en mesure de rendre à des textures à virgule flottante, vous devez vérifier et activer EXT_color_buffer_float

+0

merci, bon à savoir. Mais qu'est-ce que cela signifie réellement "non rendu" ... que puis-je faire avec cette texture? Cela signifie-t-il que je ne peux l'utiliser que dans vertex shader pas dans pixelshader? Je veux vraiment l'utiliser pour 3 choses? 1) comme carte de terrainheight 2) pour raymarching de la texture 3D 3) comme tampons pour les calculs (en utilisant le feedback de la transformation ou les shaders de calcul). –

+0

non rendu signifie que vous ne pouvez pas le faire. En d'autres termes, vous ne pouvez pas joindre un framebuffer. Non filtrable signifie que vous ne pouvez pas filtrer indirectement à travers l'échantillonneur. Cela signifie que l'échantillonneur doit être réglé sur "PROCHE". Avoir une texture float est toujours super utile même si vous ne pouvez pas le filtrer. Un bon exemple est que les matrices de skinning sont souvent stockées dans des textures, car vous en avez besoin de plus que ce qui va dans les uniformes. Ils n'ont pas besoin d'être filtrés. Vous pouvez également filtrer manuellement dans votre shader (lire la texture plusieurs fois, somme et résultat moyen). Bien sûr, il sera probablement lent. – gman

+0

Donc, vous pouvez l'utiliser comme une heightmap. Il faudra juste régler au plus proche. Ce n'est généralement pas un problème pour une heightmap. Il semble que vous pourriez l'utiliser pour raymarch, sauf bien sûr, il pourrait être granuleux, sauf si vous faites votre propre filtrage. Vous pourriez considérer les formats float 16 bits pour cela car ils peuvent être filtrés par défaut. En ce qui concerne les tampons pour les calculs, vous pouvez les utiliser en entrée mais pas en sortie à moins que le périphérique ne prenne en charge 'EXT_color_buffer_float'. la plupart des ordinateurs de bureau font. la plupart des téléphones/tablettes ne le font pas. – gman