Le pack GLSL flotte dans une texture RGBA

8

Je veux composer des modèles et des particules triangulaires conventionnels avec une scène tracée par rayons à une fréquence d'images raisonnable.

webGL ne vous permet pas d'écrire le gl_FragDepthdans le fragment shader. Vous ne pouvez pas avoir plusieurs cibles de rendu, mais vous pouvez effectuer un rendu sur une texture RGBA, puis utiliser cette texture comme entrée dans un autre dessin. Je peux donc restituer ma scène tracée par rayons et stocker la profondeur comme entrée pour la prochaine étape. C'est évidemment loin d'être idéal, mais réalisable.

J'adorerais me tromper à ce sujet, et cela est tiré d'essais et d'erreurs plutôt que de toute source définitive; veuillez corriger toute hypothèse erronée

Comment pouvez-vous emballer / décompresser un flottant et, idéalement, certains bits de drapeau et autres, dans une texture RGBA efficacement dans un shader de fragment GLSL?

Volonté
la source
2
Il y a un vieil article dans le premier livre GPU Gems sur le mapping d'ombres (vous pouvez le lire ici: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Il explique comment emballer des flotteurs dans une texture RGBA de deux manières différentes. Regardez la section 12.3.3 pour l'écriture, puis 12.3.6 pour la lecture.
Benlitz
1
Une autre ressource qui pourrait être utile est l'article "Compact Normal Storage for Small G-Buffers" par Aras P de Unity ( aras-p.info/texts/CompactNormalStorage.html ). Cet article est limité aux normales uniquement.
Mortennobel
1
Vous pouvez créer une texture R32F et y écrire simplement vos valeurs de profondeur. sans aucun déballage d'emballage. puis lors de votre deuxième passe "classique en triangle", utilisez cette texture comme tampon de profondeur (attaché comme profondeur à FBO). N'hésitez pas à en demander plus si ce n'est pas clair.
alariq
@alariq oui, l'extension float est désormais largement prise en charge.
Will
@Will Si l'extension float a résolu votre problème, postez-la comme réponse et acceptez-la.
Polar

Réponses:

5

Voici les fonctions pack et unpack qui fonctionneront sur WebGL et OpenGL ES 2.0, ce n'est que pour les valeurs dans la plage 0 ... 1, vous devez donc vous assurer que votre calcul de profondeur est dans le bon espace.

Encodage des flottants en RGBA

gbpaul
la source
Pouvez-vous ajouter les extraits de code à votre réponse? Si le site que vous avez mentionné tombe en panne, le lien ne servira à rien.
Felipe Gutierrez